楕円曲線暗号に 512 bit は存在しない

Posted on

新しい SSH 鍵を作るために ssh-keygen のマニュアルを読んでいたら、おもしろい記述を見つけました。鍵のビット長を指定する b オプションの説明です。

For ECDSA keys, the -b flag determines they key length by selecting from one of three elliptic curve sizes: 256, 384 or 521 bits.

「ECDSA キーの場合、b オプションは 3 つの楕円曲線サイズのいずれかを選択することでキーの長さを決定する」。ここまでは理解できるのですが、示された 3 つ目のビット長が 521 bit なんです。

「えっ、2^9 の 512 bit じゃなくて 521 bit なの?」エンジニアなら違和感を感じて、まずタイポを疑いますよね。自分もタイポだと思って Fedora で試してみると…。

$ ssh-keygen -t ecdsa -b 512
Invalid ECDSA key length - valid lengths are 256, 384 or 521 bit

予想に反して怒られました。タイポではなく本当に 521 bit なのか?気になったので調べてみました。

RFC を探ってみる

RFC のドキュメントを探ってみると 521 bit の理由と思われる記述がありました。 RFC 5639 - 2.2. Technical Requirements より引用します。

For each of the bit lengths 160, 192, 224, 256, 320, 384, and 512, one curve shall be proposed. This requirement follows from the need for curves providing different levels of security that are appropriate for the underlying symmetric algorithms. The existing standards specify a 521-bit curve instead of a 512-bit curve.

意訳すると「それぞれのビット長に対して、別々の楕円曲線が使われるべきだが、それを満たせないので 512 bit ではなく 521 bit を使う」といった感じでしょうか。

ここでさらなる疑問。先ほどの RFC 5639 で 7 つのビット長が示されているのに、OpenSSH では 256, 384, 521 bit しか実装されていません。 RFC に従ってないじゃんと思いましたが、RFC 5656 に答えがありました。

RFC 5656 のタイトルは「Elliptic Curve Algorithm Integration in the Secure Shell Transport Layer(SSH トランスポート層での楕円曲線アルゴリズムの統合)」。楕円曲線暗号を SSH で利用するための仕様です。この RFC の 6.1. Elliptic Curve Domain Parameter Identifiers に必須の楕円曲線として 256, 384, 521 bit が挙げられています。

ちなみに、楕円曲線暗号が使えるのは OpenSSH 5.7 からです。 CentOS 6 系では鍵を作れませんし、認証もできませんのでご注意を。