2010/03/05

"-newkey ec"

楕円曲線暗号 (Elliptic Curve Cryptography, ECC) ってのがあります
公開鍵暗号の1つです
暗号使いたいといったら OpenSSL
OpenSSL なら ECC もばっちりに違いないと思い適当にコマンド叩きはじめました

Debian Lenny は OpenSSL 0.9.8g だそうです

とりあえず CSR 作る辺りの話ってのは幅広い暗号の話が? と思い
$ openssl req -help
unknown option -help
req [options] <infile >outfile
where options are
-inform arg input format - DER or PEM
(中略)
-newkey ec:file generate a new EC key, parameters taken from CA in 'file'
(後略)
"unknown option -help" とか言われてますが
"-newkey ec:file" で ECC な CSR が作れるっぽい!

そこで、ググってみましたところ
OpenSSLによる楕円曲線暗号の利用
え〜と、変な検索語使わなくても良かったんじゃないの?

楕円曲線暗号ってのは、楕円曲線の上で掛け算をするんですが
楕円曲線っての自体が沢山あるので先ずどれを使うか決めないといけません
どれでもいいかというとそういうわけではなく
ものによっては暗号としての強度が落ちてしまうそうなので
「これ使ってこうぜ!!」ってのが定められています

http://www.ietf.org/rfc/rfc4492.txt
http://www.ietf.org/rfc/rfc5480.txt
http://www.ietf.org/rfc/rfc5639.txt
あれ、なんか、一杯あるな、どれだ

で、最初にどの曲線使うか決めるわけですが
openssl に ecparam ってのがありまして
$ openssl ecparam -list_curves
secp112r1 : SECG/WTLS curve over a 112 bit prime field
secp112r2 : SECG curve over a 112 bit prime field
secp128r1 : SECG curve over a 128 bit prime field
secp128r2 : SECG curve over a 128 bit prime field
secp160k1 : SECG curve over a 160 bit prime field
secp160r1 : SECG curve over a 160 bit prime field
secp160r2 : SECG/WTLS curve over a 160 bit prime field
(後略)
と、扱える曲線のリストが出ます
で、実際にパラメータを出すには
$ openssl ecparam -name secp224r1
-----BEGIN EC PARAMETERS-----
BgUrgQQAIQ==
-----END EC PARAMETERS-----
とすると base64 された形で出てきます
これをファイルに入れといたりすれば OK

で、次に鍵を作りたいということで
$ openssl ecparam -name secp224r1 -genkey
-----BEGIN EC PARAMETERS-----
BgUrgQQAIQ==
-----END EC PARAMETERS-----
-----BEGIN EC PRIVATE KEY-----
MGgCAQEEHFaQDqPQ8x4NAr5Bz67BZcgqZurwgy4UGdlQ2OegBwYFK4EEACGhPAM6
AASNeby2ALikGQghKhN1a1SSvi1J+y1l55kE3AH1c4y+6LcesqdYKtkLt0P303p+
IH1Tj0J9MxqEJA==
-----END EC PRIVATE KEY-----
のように parameter と鍵が一緒に出せます

鍵だけ ecc.key というファイルに入れておいて
$ openssl ec -in ecc.key -param_out
read EC key
writing EC key
-----BEGIN EC PARAMETERS-----
BgUrgQQAIQ==
-----END EC PARAMETERS-----
と parameter を取り出すことも可能

じゃぁパラメータだけ出しても仕方なくない?
というとそうでもなくて、最初の req で出てきた -newkey で使えます
parameter の base64 を ecc.param ってファイルに入れといて
$ openssl req -new -newkey ec:ecc.param -nodes
Generating a 224 bit EC private key
writing new private key to 'privkey.pem'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:
や、まぁ、作っといて req に食わしてもいいんですが

CSR は CSR なんで、
あとはこれを RSA で署名してもいいし、ECC で署名してもいいし、
煮ても焼いても美味しく頂けます