電子署名≠秘密鍵で暗号化

電子署名もしくはデジタル署名のことを『文書(のハッシュ値)を秘密鍵で暗号化することで電子署名が実現される』といった説明しているのをよく目にする。というか、それ以外の説明を見ることはまずないと言ってしまってもそれほど間違いではないかもしれない。

で、それに続けて“その”電子署名の仕組がいかにももっともらしく説明されていたりすると、それでもう完璧に理解した気になってしまい、今度はどこかで自分がその説明をしてしまう。というのがつまり拡大再生産というわけだ。

実は、上の説明は二重の意味で間違っていると言える。

まず一つ目、これはそれほど重大な間違いではないし、逆に異を唱えるこちらの方が重箱の隅つつきと非難されてしまいそうでいささか不安なほどなのだが、『秘密鍵で暗号化する』というそこはかとない違和感な表現はなんとかしてもらいたいものである。

そもそも、『暗号化』と呼ぶ以上、それは(複数であっても構わないんだが)『特定の相手によってのみ復号可能』という条件が成り立っていて欲しいんだよね。ところが、公開鍵を不特定多数の相手に公開してしまってこその公開鍵暗号なんだから、『秘密鍵で暗号化』されたデータなどというものがもしあったとしても、それは誰でも復号ができる、つまり、暗号化されたと呼べるようなデータではまったくないわけ。で、正確を期すならば、『秘密鍵で変換されたデータ』程度に留めておかなければならないということ。

たしかにRSAというアルゴリズムは秘密鍵を使う処理も公開鍵を使う処理もまったく同じようにできるという素晴らしい対称性を持っているので(ただし、真っ当なRSAアルゴリズム実装であれば決して両者を対称に扱ったりはしない。秘密鍵に関する処理には中華風剰余定理を用いた最適化がなされるからである。この辺りに関しては、『サルでは判らんだろうけど中華風剰余定理について』を参照のこと)、RSAによる電子署名処理ならばこれを『秘密鍵で暗号化する』と表現してしまいたくなる気持ちもよく判る(というか、自分自身にしたところが昔書いた文章にはそうした表現を採っているものがあった筈である。まったくもって面目ない)。でも、日本語として不適切な言葉の使い方はやめといた方がいいと思うわけだ。

で、もう一つの問題点だけど、こっちの方は間違いなく重大な間違い。だと思う。じゃないかな。だといいんだけど。うーんどーなんだろ。ま、続けてみようか。

上で『RSAというアルゴリズムは秘密鍵を使う処理も公開鍵を使う処理もまったく同じようにできるという素晴らしい対称性を持っている』と書いたんで、勘の鋭い人ならもう気付いているかもしれんけど、RSA以外の公開鍵暗号アルゴリズムでは実は秘密鍵を使う処理と公開鍵を使う処理とはまったく異なってるの。で、そもそも、暗号化にも署名にもどちらにも使えるってアルゴリズムもRSAの他にはElGamalというのがあるくらいなんだよね。しかも、そのElGamalの場合でも、秘密鍵を使う処理と公開鍵を使う処理とはまったく非対称なので、それを反映して暗号化の手続きと署名の手続きとはまったく異なるというかなりトリッキーな方法で同じ鍵ペアを暗号化と署名の両方に使えるように図られてるのさ(この辺りに関しては、『サルでは判らんだろうけどElGamalアルゴリズムとは』を参照のこと)

で、そういう視点を持った上で改めて『文書(のハッシュ値)を秘密鍵で暗号化することで電子署名が実現される』という表現を見てみると、そのおかしさが明らかになるのではないかな。RSAを前提とした議論であればなんとか(=上に書いた些細な難点を除けば)許容もできるのだけれども、往々にしてこれがDSAに関する説明として書いてあったりするんで、もう目も当てられない。で、例のIBMのOpenSSH解説ウェブページの第1回では電子署名という言葉こそ使わないものの、SSH1プロトコルで使われる公開鍵暗号による認証に関して重要なところで間違った説明をした直後に、DSAの名前を出しちゃってるので、完全にアウト。

DSAってアルゴリズムは、とても『文書(のハッシュ値)を秘密鍵で暗号化することで電子署名が実現される』なんて表現で語れるほど単純じゃない複雑怪奇な代物なのよ。こいつは既出のElGamal署名アルゴリズムを改良してより効率的に署名処理および署名データを実現したものと言える。

DSAの中身については、『サルでは判らんだろうけどDSAって』を…、とか言ってるといい加減怒られそうなので、いちおうここでちょっと解説。まず、DSAによる署名/検証処理を図式的に書くとこんな感じ。

Schematic Algorithm of DSA

ElGamalの改良型ということで公開鍵暗号のなかでもいわゆる乗法群上の離散対数計算困難性に基づくタイプと言えるわけだけど、このタイプは鍵の他にいくつかのパラメータを使うのが普通。DSAでも秘密鍵(x)と公開鍵(y)の他に署名者/検証者が共有しなけりゃならないいくつかのパラメータ(p,q,g)、そして、これは署名者だけが知っていればよい署名処理毎に変わるkなる一時データが用いられ、それらを使ったかなり複雑な処理が署名処理/検証処理の両方で行なわれる。

署名アルゴリズムの一部として被署名データのハッシュも含んでいるのがDSAの一つの特徴。しかも、そこで使うハッシュ関数も他の何かじゃなくってSHA-1と指定されている。このSHA-1というハッシュアルゴリズムはDSAのパラメータの一つqと同じサイズである160bitのハッシュ値が得られるようになっており、これが ElGamal署名と比べてずっと小さい署名データを実現することにも役立っているわけで、DSAはそのようなハッシュも含めて最初からトータルな設計がなされているという意味で署名アルゴリズムの新世代だと言えるんだろう(RSA署名なんかでは公開鍵アルゴリズムとハッシュは完全に後付だからね)

で、もっとも面白いのは、検証処理の時比較対象として用いられるデータが図を見て明らかな通り、署名データの片割れであるrという被署名データとはなんら関わりない値である、という点かしら。

で、こりゃどう見ても『文書(のハッシュ値)を秘密鍵で暗号化することで電子署名が実現される』なんて言葉で表せるようなものでは全然ないっしょ?興味があればも少し詳しく説明してもいいんだけど、とりあえず今日のところはここまで。

まぁ、このようなことを知っていたとしても、ただでさえ限られたスペースのなかで説明するのも大変だし、いきおい『ハッシュ値を秘密鍵で暗号化して…』型の説明で逃げたくなる気も判らんでもないんだが、そんな時でも『仕組はこれだけじゃない』という注釈だけは残そうや。bent curve sign出して解説せいやとまでは言わんからさ。


稲村 雄 =JANE=
Last modified: Mon Jul 21 20:47:25 JST 2003