2013年2月20日水曜日

PerlのCrypt::OpenSSL::RSAの使い方

CPANは
http://search.cpan.org/~perler/Crypt-OpenSSL-RSA-0.28/RSA.pm
にあるのだが、使い方がわからず苦労した。
一言でいうと公開鍵と秘密鍵を使った暗号化、復号化をやるモジュール。

とりあえず、公開鍵、秘密鍵を作って、平文を暗号化、暗号化された文を復号化、
秘密鍵でシグネチャーを作って公開鍵からシグネチャーを検証という流れで
ワンライナーを書いてみる。

perl -MData::Dumper -MCrypt::OpenSSL::RSA -e '
my $rsa = Crypt::OpenSSL::RSA->generate_key(1024);
print "\nprivate key is:\n", $rsa->get_private_key_string();
print "\npublic key is:\n", $rsa->get_public_key_string();
my $rsa_priv = Crypt::OpenSSL::RSA->new_private_key($rsa->get_private_key_string());
my $rsa_pub = Crypt::OpenSSL::RSA->new_public_key($rsa->get_public_key_string());
my $plaintext = "hogehoge";
my $ciphertext = $rsa_pub->encrypt($plaintext);
print "\nplaintext:\n", $plaintext;
print "\nciphertext:\n", $ciphertext;
my $decrypttext = $rsa_priv->decrypt($ciphertext);
print "\ndecrypttext:\n", $decrypttext;
my $signature = $rsa_priv->sign($plaintext);
print "\nSigned correctly\n" if ($rsa_pub->verify($plaintext, $signature));
'

出力結果が下記。これで大体何やっているのかイメージできるはず。
verifyは$rsa_pub,$rsa_priv,$rsaのいずれを使ってもできる。

private key is:
-----BEGIN RSA PRIVATE KEY-----
MIICXQIBAAKBgQC8/wOauGk2C5F8bNjU5F8nDK0TWuZxKex8a2e1+GPigZ0O2O+0
Cq0mYFaAFpl0rk3N2wfy76A4pW+gngtcWzGubwgcCAmemlPwFMhR6OUjZ14Ej8is
7GLi3kvJeuRTGSJqjIqC5+qGqX/Ms8rBp/ToZdhkwijJZJpSZaJiYz3FrQIDAQAB
AoGABybfTAuOb60gZET6L5Q0xZWFNyZJch7UBCFMW2Z64SdmehlbeMSuqLUckNxK
ElBGQXP4aQkIVxxrjPhuFaCd0JtOdVz5TMSs/9tNSCnBDxliziBAtGWjcQorECv8
ah6KJib3+MmmtP/wBs8dt3dpt3w3VS7Oc6M5x0ND9ZfN0gECQQDvEwAJX/qcdAru
Xb7XxnsYjSO0OHCEzjfEJDPrqHqwDNcyGOTYdLhrgd2ZyH/Elpifv9W0iKEYegzf
P1BwtG9VAkEAymBlIyLatDICBa3u1LWxI61rRwn5r3FLjit4wSJw4TYfoAFVOM16
+cHHjSeQotVXa2EV2gzpXOiviIgkjW+M+QJAREc74nGL5HTrzkntwDhKXaepg8X+
tJ8kpBrmzS3v5Cm2p/MeIIetR97uCAaQHvgXnMAv64B96bypwnSVp6qQhQJBAIHC
fvahcYOakOtdU8Z1XUgX+LIK9lqElUJqIzoKwD/W+T4ZvK/4KIKdujqKhNWzXyMN
k/pEzxhwZaRwTqeVP9kCQQDcHaLAVc7GHFI7PEiWZi2QG8f8jzEkkaZk/qDpKzji
7H44HfLPK/3Zey1AjOQscPE4BM1urBOkN/OfA4GvI7nq
-----END RSA PRIVATE KEY-----

public kye is:
-----BEGIN RSA PUBLIC KEY-----
MIGJAoGBALz/A5q4aTYLkXxs2NTkXycMrRNa5nEp7HxrZ7X4Y+KBnQ7Y77QKrSZg
VoAWmXSuTc3bB/LvoDilb6CeC1xbMa5vCBwICZ6aU/AUyFHo5SNnXgSPyKzsYuLe
S8l65FMZImqMioLn6oapf8yzysGn9Ohl2GTCKMlkmlJlomJjPcWtAgMBAAE=
-----END RSA PUBLIC KEY-----

plaintext:
hogehoge
ciphertext:
8ۺğ;Z~A4u&)|){.+%j;6ǏF8T)
                            Jטo]юKzߺ>h݈.
decrypttext:
hogehoge
Signed correctly