dodaの日記: DSA鍵の鍵長
開発MLで2048ビットのDSA鍵のサポートはどうしようか聞いて見たら、永田さんから英語版Wikipediaでの項目を紹介された。
読んで見ると、まだドラフトだけどFIPS 186-3では2048,3072ビットもOKになるらしい事がわかった。
さらに規格書へのリンクもあったので、ついでにFIPS 186-1~FIPS 186-3を読んで見ることにした。
最初は適当に関連のありそうな所を斜め読みすればいいかなと思っていたけれど、実際に読んで見ると単純な問題じゃない事がわかった。
おおざっぱに書くと、
- DSA鍵のパラメータには、ドメインパラメータ(p, q, g), 秘密鍵(x), 公開鍵(y)がある。
- DSA鍵の鍵長はpのビット数(L)とqのビット数(N)の組み合わせという事になる。
- 1024ビットDSA鍵と言った場合、この1024ビットというのはLの事を言っている。
- Nは使用するダイジェスト関数の出力のビット長にあわせる。
- FIPS 186-1ではLは512~1024ビット(64ビット単位)で、ダイジェスト関数にはSHA-1を使うのでNは常に160である。(このためDSA鍵の鍵長といった場合はLの値の事になってしまったと思われる)
- FIPS 186-2で1024ビットのみに限定されたが、Nについては変更なし。
- FIPS 186-3では(L,N)の組み合わせとして、(1024,160), (2048,224), (2048,256), (3072,256)の四つの内から選ぶ。(N=224/N=256の場合はダイジェスト関数にSHA-224/SHA-256を使う)
という事らしい。
しかし、RFC4253はFIPS 186-2を元に書かれているのでダイジェスト関数にはSHA-1を使う事になっていて、そのためNの値は160のみという事になる。
これにはちょっと参った。FIPS 186-3とRFC4253の両方を厳密に守ると(1024,160)の組み合わせしかない事になる。
これだとFIPS 186-2に従っているのと同じ事になるよなあ。
OpenSSHのssh-keygenがFIPS 186-3を先取りせず、FIPS 186-2での制限である1024ビットのみに従っているのも納得できる。
puttygenで2048ビットDSA鍵を生成した場合はどうなるか調べて見ると、Nは160だった。
ダイジェスト関数を勝手に変えるわけにはいかないので、これもまあ妥当だろう。
Tera TermでDSA鍵を生成する時に使っている、OpenSSLのDSA_generate_parameters()で鍵長に2048ビットを指定した場合どうなるかを調べたら、puttygenと同じようにNは160になった。
これらの(2048, 160)なDSA鍵でも、少なくともOpenSSHのsshdが相手の場合は問題なく認証に使えた。
この結果から、方針としては以下の二つが考えられる。
- OpenSSHと同じように1024ビットのみ許す
- puttygenと同じように、2048ビット等も許容する(Nは160固定)
どちらにするかちょっと考えたが、結局puttygenと同じように1024ビットよりも大きい鍵を生成出来るようにした。
やっぱり、いまさら1024ビットのみっていうのは無いと思うし。
Nを変えずにLだけを大きくする事にどれ程の意味が有るかはちょっと疑問だけど、それでも多少はマシかなと思う。
ただ、将来的にRFC4253で決められている事がどうなるかは判らないので、最悪(2048,160)なDSA鍵が使えなくなるかも知れないけれど、その時はその時か。
DSA鍵の鍵長 More ログイン