Crypt::PK::ECC

楕円曲線暗号を行なう。

楕円曲線暗号関連のパッケージは他にも色々あるが、使えそうなのは、このモジュールだけ。
Crypt::OpenSSL::ECDSA … 入出力パラメターが Crpt::OpenSSL::ECオブジェクトで恐ろしく複雑怪奇で使いづらい。
Crypt::Perl::ECDSA … バグがある模様で、正しくない署名を生成する。

use Crypt::PK::ECC;
パッケージをロードする。

my $pk = Crypt::PK::ECC->new();
空のオブジェクトを生成する。後で鍵を生成するか、インポートする事を想定した方法。newオブジェクトで鍵をインポートする事も出来るが、後でインポートする方が多くの形式をサポートしている。

my $pk = Crypt::PK::ECC->new($priv_or_pub_key_filename);
my $pk = Crypt::PK::ECC->new(\$buffer_containing_priv_or_pub_key);
my $pk = Crypt::PK::ECC->new($priv_pem_key_filename, $password);
my $pk = Crypt::PK::ECC->new(\$buffer_containing_priv_pem_key, $password);

ASN.1表記された鍵ファイル、または、変数上のASN.1表記された鍵を読み込んでオブジェクトを生成する。暗号化された秘密鍵ファイルは読めない。暗号化されて PEMファイルの場合は、復号しつつ DERに変換して入力する。

my $derKey;
open(FHI, "openssl ec -in $caKey -outform der |");   # openSSLがパスフレーズを要求して復号してくれる
binmode(FHI);
read(FHI, $derKey, 5000);
close(FHI);
my $ecdsa = Crypt::PK::ECC->new(\$derKey);

$pk->generate_key($curve_name);
楕円曲線名を指定して鍵を生成する。曲線名は、secpXXXX, primeXXXX, NIST曲線名は nistpXXXと表記する。ドメインパラメータを直接指定する事も可能。

$pk->import_key($filename);
$pk->import_key(\$buffer_containing_key);
$pk->import_key($filename, $password);
$pk->import_key(\$buffer_containing_key, $password);

ASN.1表記された鍵ファイル、または、変数上のASN.1表記された鍵をインポートする。

$pk->import_key($hashref);
楕円曲線名と鍵値を直接指定したハッシュから鍵をインポートする。色々出来るが、典型的な例は:
{
   curve_name => "secp160r1",
   k => "B0EE84A749FE95DF997E33B8F333E12101E824C3",
   pub_x => "5AE1ACE3ED0AEA9707CE5C0BCE014F6A2F15023A",
   pub_y => "895D57E992D0A15F88D6680B27B701F615FCDC0F"
}

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');

鍵を DER形式ファイル、または、PEM形式ファイルにエクスポートする。

my $signature = $priv->sign_message($message, $hash_name);
my $valid = $pub->verify_message($signature, $message, $hash_name);

署名/署名検証を行なう。$hash_nameは、SHA256, sha256, SHA-256, 256など Digest::SHAが認識する名称で指定する。

my $rv = $pk->is_private;
秘密鍵を保持しているか否か。

my $size = $pk->size;
鍵サイズ(バイト)。