NAME

Crypt::PK::RSA - Public key cryptography based on RSA

SYNOPSIS

### OO interface

#Encryption: Alice
my $pub = Crypt::PK::RSA->new('Bob_pub_rsa1.der'); 
my $ct = $pub->encrypt("secret message");
#
#Encryption: Bob (received ciphertext $ct)
my $priv = Crypt::PK::RSA->new('Bob_priv_rsa1.der');
my $pt = $priv->decrypt($ct);
 
#Signature: Alice
my $priv = Crypt::PK::RSA->new('Alice_priv_rsa1.der');
my $sig = $priv->sign($message);
#
#Signature: Bob (received $message + $sig)
my $pub = Crypt::PK::RSA->new('Alice_pub_rsa1.der');
$pub->verify($sig, $message) or die "ERROR";

#Key generation
my $pk = Crypt::PK::RSA->new();
$pk->generate_key(256, 65537);
my $private_der = $pk->export_key_der('private');
my $public_der = $pk->export_key_der('public');
my $private_pem = $pk->export_key_pem('private');
my $public_pem = $pk->export_key_pem('public');

### Functional interface

#Encryption: Alice
my $ct = rsa_encrypt('Bob_pub_rsa1.der', "secret message");
#Encryption: Bob (received ciphertext $ct)
my $pt = rsa_decrypt('Bob_priv_rsa1.der', $ct);
 
#Signature: Alice
my $sig = rsa_sign('Alice_priv_rsa1.der', $message);
#Signature: Bob (received $message + $sig)
rsa_verify('Alice_pub_rsa1.der', $sig, $message) or die "ERROR";

FUNCTIONS

rsa_encrypt

See method encrypt below.

my $ct = rsa_encrypt($pub_key_filename, $message);
#or
my $ct = rsa_encrypt(\$buffer_containing_pub_key, $message);
#or
my $ct = rsa_encrypt($pub_key, $message, $padding);
#or
my $ct = rsa_encrypt($pub_key, $message, 'oaep', $hash_name, $lparam);

rsa_decrypt

See method decrypt below.

my $pt = rsa_decrypt($priv_key_filename, $ciphertext);
#or
my $pt = rsa_decrypt(\$buffer_containing_priv_key, $ciphertext);
#or
my $pt = rsa_decrypt($priv_key, $ciphertext, $padding);
#or
my $pt = rsa_decrypt($priv_key, $ciphertext, 'oaep', $hash_name, $lparam);

rsa_sign

See method sign below.

my $sig = rsa_sign($priv_key_filename, $message);
#or
my $sig = rsa_sign(\$buffer_containing_priv_key, $message);
#or
my $sig = rsa_sign($priv_key, $message, $padding);
#or
my $sig = rsa_sign($priv_key, $message, $padding, $hash_name);
#or
my $sig = rsa_sign($priv_key, $message, 'pss', $hash_name, $saltlen);

rsa_verify

See method verify below.

rsa_verify($pub_key_filename, $signature, $message) or die "ERROR";
#or
rsa_verify(\$buffer_containing_pub_key, $signature, $message) or die "ERROR";
#or
rsa_verify($pub_key, $signature, $message, $padding) or die "ERROR";
#or
rsa_verify($pub_key, $signature, $message, $padding, $hash_name) or die "ERROR";
#or
rsa_verify($pub_key, $signature, $message, 'pss', $hash_name, $saltlen) or die "ERROR";

METHODS

new

my $pk = Crypt::PK::RSA->new();
#or
my $pk = Crypt::PK::RSA->new($priv_or_pub_key_filename);
#or
my $pk = Crypt::PK::RSA->new(\$buffer_containing_priv_or_pub_key);

generate_key

Uses Yarrow-based cryptographically strong random number generator seeded with random data taken from /dev/random (UNIX) or CryptGenRandom (Win32).

$pk->generate_key($size, $e);
# $size .. key size: 128-512 bytes (DEFAULT is 256)
# $e ..... exponent: 3, 17, 257 or 65537 (DEFAULT is 65537)

import_key

$pk->import_key($priv_or_pub_key_filename);
#or
$pk->import_key(\$buffer_containing_priv_or_pub_key);

export_key_der

my $private_der = $pk->export_key_der('private');
#or
my $public_der = $pk->export_key_der('public');

export_key_pem

my $private_pem = $pk->export_key_pem('private');
#or
my $public_pem = $pk->export_key_pem('public');

encrypt

my $pk = Crypt::PK::RSA->new($pub_key_filename);
my $ct = $pk->encrypt($message);
#or
my $ct = $pk->encrypt($message, $padding);
#or
my $ct = $pk->encrypt($message, 'oaep', $hash_name, $lparam);

# $padding .................... 'oaep' (DEFAULT), 'v1.5' or 'none'
# $hash_name (only for oaep) .. 'SHA1' (DEFAULT), 'SHA256' (any hash supported by Crypt::Digest)
# $lparam (only for oaep) ..... DEFAULT is empty string

decrypt

my $pk = Crypt::PK::RSA->new($priv_key_filename);
my $pt = $pk->decrypt($ciphertext);
#or
my $pt = $pk->decrypt($ciphertext, $padding);
#or
my $pt = $pk->decrypt($ciphertext, 'oaep', $hash_name, $lparam);

#NOTE: $padding, $hash_name, $lparam - see encrypt method

sign

my $pk = Crypt::PK::RSA->new($priv_key_filename);
my $signature = $priv->sign($message);
#or
my $signature = $priv->sign($message, $padding);
#or
my $signature = $priv->sign($message, $padding, $hash_name);
#or
my $signature = $priv->sign($message, 'pss', $hash_name, $saltlen);

# $padding ................. 'pss' (DEFAULT) or 'v1.5'
# $hash_name ............... 'SHA1' (DEFAULT), 'SHA256' (any hash supported by Crypt::Digest)
# $saltlen (only for pss) .. DEFAULT is 12

verify

my $pk = Crypt::PK::RSA->new($pub_key_filename);
my $valid = $pub->verify($signature, $message)
#or
my $valid = $pub->verify($signature, $message, $padding)
#or
my $valid = $pub->verify($signature, $message, $padding, $hash_name);
#or
my $valid = $pub->verify($signature, $message, 'pss', $hash_name, $saltlen);

#NOTE: $padding, $hash_name, $saltlen - see sign method

is_private

my $rv = $pk->is_private;
# 1 .. private key loaded
# 0 .. public key loaded
# undef .. no key loaded

size

my $size = $pk->is_private;
# returns key size in bytes or undef if no key loaded