Crypt::PK::DH - Public key cryptography based on Diffie-Hellman

NAME  SYNOPSIS  METHODS  new  generate_key  import_key  import_key_raw  export_key  export_key_raw  shared_secret  is_private  size  key2hash  params2hash  FUNCTIONS  dh_shared_secret  DEPRECATED INTERFACE  SEE ALSO 

NAME

Crypt::PK::DH − Public key cryptography based on Diffie−Hellman

SYNOPSIS

### OO interface
#Shared secret
my $priv = Crypt::PK::DH−>new('Alice_priv_dh1.key');
my $pub = Crypt::PK::DH−>new('Bob_pub_dh1.key');
my $shared_secret = $priv−>shared_secret($pub);
#Key generation
my $pk = Crypt::PK::DH−>new();
$pk−>generate_key(128);
my $private = $pk−>export_key('private');
my $public = $pk−>export_key('public');
or
my $pk = Crypt::PK::DH−>new();
$pk−>generate_key('ike2048');
my $private = $pk−>export_key('private');
my $public = $pk−>export_key('public');
or
my $pk = Crypt::PK::DH−>new();
$pk−>generate_key({ p => $p, g => $g });
my $private = $pk−>export_key('private');
my $public = $pk−>export_key('public');
### Functional interface
#Shared secret
my $shared_secret = dh_shared_secret('Alice_priv_dh1.key', 'Bob_pub_dh1.key');

METHODS

new

my $pk = Crypt::PK::DH−>new();
#or
my $pk = Crypt::PK::DH−>new($priv_or_pub_key_filename);
#or
my $pk = Crypt::PK::DH−>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($groupsize);
### $groupsize (in bytes) corresponds to DH parameters (p, g) predefined by libtomcrypt
# 96 => DH−768
# 128 => DH−1024
# 192 => DH−1536
# 256 => DH−2048
# 384 => DH−3072
# 512 => DH−4096
# 768 => DH−6144
# 1024 => DH−8192

The following variants are available since CryptX−0.032

$pk−>generate_key($groupname)
### $groupname corresponds to values defined in RFC7296 and RFC3526
# 'ike768' => 768−bit MODP (Group 1)
# 'ike1024' => 1024−bit MODP (Group 2)
# 'ike1536' => 1536−bit MODP (Group 5)
# 'ike2048' => 2048−bit MODP (Group 14)
# 'ike3072' => 3072−bit MODP (Group 15)
# 'ike4096' => 4096−bit MODP (Group 16)
# 'ike6144' => 6144−bit MODP (Group 17)
# 'ike8192' => 8192−bit MODP (Group 18)
$pk−>generate_key($param_hash)
# $param_hash is { g => $g, p => $p }
# where $g is the generator (base) in a hex string and $p is the prime in a hex string
$pk−>generate_key(\$dh_param)
# $dh_param is the content of DER or PEM file with DH parameters
# e.g. openssl dhparam 2048

import_key

Loads private or public key (exported by "export_key").

$pk−>import_key($filename);
#or
$pk−>import_key(\$buffer_containing_key);

import_key_raw

Since: CryptX−0.032

$pk−>import_key_raw($raw_bytes, $type, $params)
### $raw_bytes is a binary string containing the key
### $type is either 'private' or 'public'
### $param is either a name ('ike2038') or hash containing the p,g values { g=>$g, p=>$p }
### in hex strings

export_key

BEWARE: DH key format change − since v0.049 it is compatible with libtomcrypt 1.18.

my $private = $pk−>export_key('private');
#or
my $public = $pk−>export_key('public');

export_key_raw

Since: CryptX−0.032

$raw_bytes = $dh−>export_key_raw('public')
#or
$raw_bytes = $dh−>export_key_raw('private')

shared_secret

# Alice having her priv key $pk and Bob's public key $pkb
my $pk = Crypt::PK::DH−>new($priv_key_filename);
my $pkb = Crypt::PK::DH−>new($pub_key_filename);
my $shared_secret = $pk−>shared_secret($pkb);
# Bob having his priv key $pk and Alice's public key $pka
my $pk = Crypt::PK::DH−>new($priv_key_filename);
my $pka = Crypt::PK::DH−>new($pub_key_filename);
my $shared_secret = $pk−>shared_secret($pka); # same value as computed by Alice

is_private

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

size

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

key2hash

my $hash = $pk−>key2hash;
# returns hash like this (or undef if no key loaded):
{
type => 0, # integer: 1 .. private, 0 .. public
size => 256, # integer: key size in bytes
x => "FBC1062F73B9A17BB8473A2F5A074911FA7F20D28FB...", #private key
y => "AB9AAA40774D3CD476B52F82E7EE2D8A8D40CD88BF4...", #public key
g => "2", # generator/base
p => "FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80D...", # prime
}

params2hash

Since: CryptX−0.032

my $params = $pk−>params2hash;
# returns hash like this (or undef if no key loaded):
{
g => "2", # generator/base
p => "FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80D...", # prime
}

FUNCTIONS

dh_shared_secret

DH based shared secret generation. See method "shared_secret" below.

#on Alice side
my $shared_secret = dh_shared_secret('Alice_priv_dh1.key', 'Bob_pub_dh1.key');
#on Bob side
my $shared_secret = dh_shared_secret('Bob_priv_dh1.key', 'Alice_pub_dh1.key');

DEPRECATED INTERFACE

The following functions/methods were removed in removed in v0.049:

encrypt
decrypt
sign_message
verify_message
sign_hash
verify_hash
dh_encrypt
dh_decrypt
dh_sign_message
dh_verify_message
dh_sign_hash
dh_verify_hash

SEE ALSO

<https://en.wikipedia.org/wiki/Diffie%E2%80%93Hellman_key_exchange>


Updated 2024-01-29 - jenkler.se | uex.se