« 『東京―ベルリン/ベルリン―東京』 @ 森美術館 | メイン | ジョン オルコック『社会生物学の勝利―批判者たちはどこで誤ったか』 »

May 10, 2006

デジタル署名は案外ややこしい

TypeKey 認証なんかの仕組みを知ろうと思って、自分で DSA による電子署名をメッセージにつけるコードを書いてみたのです。でね、ネットで検索して見つかるサンプルコードって、たとえばこんな感じのとか、あるいはこんなのが多いんです。英語でもそう。共通してるのは、一つのプログラムの中で署名して、その同じプログラムで検証してるとこです。サンプルだからでしょうけど、電子署名を使うなら絶対ありえない状況です。あるプログラムで署名して、別のプログラムで検証するってことを実際にはやりたいわけで。何をどう渡せばいいのか知りたいわけで。

いろいろ検索して「電子署名≠秘密鍵で暗号化」というページに行きついたんですが、ここに書かれてるように「メッセージのハッシュを秘密鍵で暗号化したものを署名としてつけておき、受け手側は同様にメッセージのハッシュをとって、署名を公開鍵で復号したものと比較して検証する」という説明が往々にして DSA に対してなされてたりするわけです。僕はこのページを見るまで、「TypeKey の検証をするいくつかのオープンソースのコードを見ると、なんか違う気がするんだけど…謎…」と思いつつ、メッセージのハッシュを秘密鍵で…とすればいいんだと思ってました。このページを見てようやく納得。DSA はメッセージと署名と公開鍵のほかに、p、q、g という3つのパラメータを共有しなきゃならないんですね。そして署名そのものも r と s という2つの部分からなると。

こうなってくると、自分で署名して自分で検証みたいなサンプルでは全然役に立ちません。少なくとも、どれを相手に渡さなきゃいけないか (または共有しなきゃいけないか) は、そこからは読みとれません。例えば上に挙げたサンプルは Java ですが、それだと署名は ASN.1 という形式につめこまれたバイト列として得られるんですが、僕はそこから r と s を取り出す方法で数時間ハマりました。ASN.1 のバイト列のまま渡してもいいのかもしれませんが。でまぁ、結局 BerDecoder で取り出せたんですが…。なんかすごい無駄に苦労した感じです。元々ちゃんと暗号とか電子署名の勉強してた人なら変な思いこみをしないのかもしれませんけど。疲れた。

投稿者 ryoji : May 10, 2006 09:39 PM

トラックバック

このエントリーのトラックバックURL:
http://ryoji.sakura.ne.jp/mt/mt-tb.cgi/311