Alt-Crypt-RSA-BigInt
view release on metacpan or search on metacpan
lib/Crypt/RSA.pm view on Meta::CPAN
my ($self, %params) = @_;
$params{KF} = $$self{KF} if $$self{KF};
my @keys;
return (@keys = $self->{keychain}->generate (%params))
? @keys
: $self->error ($self->{keychain}->errstr);
}
sub encrypt {
my ($self, %params) = @_;
my $plaintext = $params{Message} || $params{Plaintext};
my $key = $params{Key};
return $self->error ($key->errstr, \%params, $key, \$plaintext)
unless $key->check();
my $blocksize = blocksize ( $$self{es}->encryptblock (Key => $key),
length($plaintext)
);
return $self->error("Message too long.", \$key, \%params) if $blocksize <= 0;
my $cyphertext;
my @segments = steak ($plaintext, $blocksize);
for (@segments) {
$cyphertext .= $self->{es}->encrypt (Message => $_, Key => $key)
|| return $self->error ($self->{es}->errstr, \$key, \%params);
}
if ($params{Armour} || $params{Armor}) {
$cyphertext = $self->{pp}->armour (
Object => 'RSA ENCRYPTED MESSAGE',
Headers => {
Scheme => $$self{ES}{Module} || ${$KNOWNMAP{$$self{ES}{Name}}}{Module},
Version => $self->{es}->version()
},
Content => { Cyphertext => $cyphertext },
Compress => 1,
);
}
return $cyphertext;
}
sub decrypt {
my ($self , %params) = @_;
my $cyphertext = $params{Cyphertext} || $params{Ciphertext};
my $key = $params{Key};
return $self->error ($key->errstr, \%params, $key) unless $key->check();
if ($params{Armour} || $params{Armor}) {
my $decoded = $self->{pp}->unarmour ($cyphertext) ||
return $self->error ($self->{pp}->errstr());
$cyphertext = $$decoded{Content}{Cyphertext}
}
my $plaintext;
my $blocksize = blocksize ( $$self{es}->decryptblock (Key => $key),
length($cyphertext)
);
return $self->error("Message too long.") if $blocksize <= 0;
my @segments = steak ($cyphertext, $blocksize);
for (@segments) {
$plaintext .= $self->{es}->decrypt (Cyphertext=> $_, Key => $key)
|| return $self->error ($self->{es}->errstr, \$key, \%params);
}
return $plaintext;
}
sub sign {
my ($self, %params) = @_;
my $signature = $self->{ss}->sign (%params)
|| return $self->error ($self->{ss}->errstr,
$params{Key}, \%params);
if ($params{Armour} || $params{Armor}) {
$signature = $self->{pp}->armour (
Object => "RSA SIGNATURE",
Headers => {
Scheme => $$self{SS}{Module} || ${$KNOWNMAP{$$self{SS}{Name}}}{Module},
Version => $self->{ss}->version() },
Content => { Signature => $signature },
);
}
return $signature;
}
sub verify {
my ($self, %params) = @_;
if ($params{Armour} || $params{Armor}) {
my $decoded = $self->{pp}->unarmour ($params{Signature}) ||
return $self->error ($self->{pp}->errstr());
$params{Signature} = $$decoded{Content}{Signature}
}
my $verify = $self->{ss}->verify (%params) ||
return $self->error ($self->{ss}->errstr, $params{Key}, \%params);
return $verify;
}
sub blocksize {
my ($blocksize, $ptsize) = @_;
return $ptsize if $blocksize == -1;
return 0 if $blocksize < 1;
return $blocksize;
}
1;
=pod
=encoding utf8
=head1 NAME
Crypt::RSA - RSA public-key cryptosystem.
=head1 SYNOPSIS
my $rsa = new Crypt::RSA;
my ($public, $private) =
$rsa->keygen (
Identity => 'Lord Macbeth <macbeth@glamis.com>',
Size => 1024,
Password => 'A day so foul & fair',
Verbosity => 1,
) or die $rsa->errstr();
my $cyphertext =
$rsa->encrypt (
Message => $message,
Key => $public,
Armour => 1,
) || die $rsa->errstr();
my $plaintext =
$rsa->decrypt (
Cyphertext => $cyphertext,
Key => $private,
Armour => 1,
) || die $rsa->errstr();
my $signature =
$rsa->sign (
( run in 2.549 seconds using v1.01-cache-2.11-cpan-e1769b4cff6 )