署名はハッシュして復号?暗号化?

太郎

ディジタル署名の勉強をしているんだけど、メッセージのハッシュ値を計算して、ハッシュ値を秘密鍵で暗号化する、って書いてあるときと、秘密鍵で復号するって書いてあるときがあるんだ。どっちが正しいの?   

花子

たしかに、どちらの書き方も見たことがあるね。ところで、そもそも、暗号化と復号というのは、どういう事かな?

太郎

署名は公開鍵暗号を使って作れる、って書いてある。だから、公開鍵暗号の暗号化と復号のことでしょ?   

花子

そうだね、公開鍵暗号の場合、「秘密鍵」を使うのは「復号」だね。「暗号化」は誰でもが知っている公開鍵を使う。

太郎

じゃあ、「秘密鍵で復号する」が正しいんだね。でも、ハッシュ値は暗号文ではないのに、復号するって、何か変だなあ。署名の確認には「公開鍵で暗号化する」って書いてある。暗号化したものを復号するのが暗号なのに、復号したものを暗号化するなんて、おかしいよ。   

花子

そうだね。だから、「秘密鍵で暗号化」と書いてある文献もあるんだね。そういう文献では、署名の確認では「公開鍵で復号する」って書いてあるでしょう?

太郎

うん。暗号化して復号、ならしっくりいく。ハッシュ値を暗号化して、それを復号すると、元のハッシュ値が出てくるはず、っていう性質を使っているね。じゃあ、やっぱり「秘密鍵で暗号化」が正しいの?   

花子

実はどちらも正しいともいえるし、どちらも間違いともいえる。公開鍵暗号とディジタル署名は色々な方式があるけれど、具体的にどんなものがあるか知っている?

太郎

代表的な公開鍵暗号はRSA暗号、代表的なディジタル署名はRSA署名。   

花子

よくできました。RSA暗号では、暗号化と復号でやっている計算式は全く同じで、ただ単に使う鍵が違うだけ。だから、「暗号化する」でも「復号する」でも、やっていることは同じ。

太郎

なるほど!だから、どっちも同じで、どっちも正しいんだね!   

花子

どちらも正しいと言ったものの、やっぱり「秘密鍵で暗号化・公開鍵で復号」は気持ちわるいなあ。RSA暗号では、平文と暗号文が一対一対応になっているから、「暗号化して復号すると元に戻る」だけでなく、「復号してから暗号化しても元に戻る」という性質があることを説明したうえで、「ハッシュ値を秘密鍵で復号・署名を公開鍵で暗号化」と説明するのが良いのではないかな。


エルガマル暗号の場合は。。。

太郎

あれ? さっき、どちらも間違い、とも言ってた?   

花子

そう。RSA暗号とRSA署名の場合はどちらも正しいけれど、公開鍵暗号はRSA暗号だけではないし、ディジタル署名もRSA署名だけではないからね。

太郎

どちらも間違いの場合もあるということ?   

花子

というか、RSA署名以外の場合は、大抵どちらも間違いだったりするよ。RSA暗号と同じくらい古くから知られているエルガマル暗号という公開鍵暗号があるけれど、エルガマル暗号を使って、「ハッシュ値を秘密鍵で復号」しても、「ハッシュ値を秘密鍵で暗号化」しても、上手く署名は作れないんだよ。

太郎

そっか。じゃあ、エルガマル暗号を使った「エルガマル署名」は無いんだね。   

花子

あ、いや、「エルガマル署名」というのは存在する。有名なディジタル署名であるDSAやECDSAの元になっている署名方式だよ。でも、これはエルガマル暗号から作っているわけではないんだ。名前が同じなのは、作った人が同じエルガマルさんだから。

太郎

そうなんだ。では、エルガマル署名では、署名はどうやって作るの?   

花子

まず、メッセージのハッシュ値を計算して、それを秘密鍵を使って加工する。「加工する」の計算は、エルガマル暗号の暗号化とも復号とも違う。まあ、同じ人が作ったから、エルガマル暗号とエルガマル署名には共通点が色々あるけどね。

太郎

な、なるほど?   

花子

署名を検証する時には、メッセージのハッシュ値を計算してから、ハッシュ値と公開鍵と署名が、ある検証式を満たすかどうかを確認する。

太郎

・・・ 「加工する」とか「ある検証式」では、ちっとも分からないよ。

花子

うーん、具体的な数式を書かないと、この程度のことしか言えないんだな。「暗号化する」とか「復号する」と表現できればわかりやすいかもしれないけど、暗号方式から作っているわけではないので、そんな風に言い表すことが出来ないんだ。

太郎

そうか。。。RSA署名とは全然違うね。   

花子

全然違うとも言えないよ。エルガマル署名をRSA署名のように表現することはできないけれど、逆に、RSA署名をエルガマル署名のよう表現することはできる。

RSA署名では、「署名を公開鍵で復号(あるいは暗号化)したものがハッシュ値と一致するかどうか」を確認するでしょう? だから、「署名を公開鍵で復号(あるいは暗号化)したもの = ハッシュ値」を検証式だと思えば、エルガマル署名と同じだよ。

太郎

なるほど! 署名を作るのも、「加工する」方法をRSA暗号の「暗号化」だったり「復号」と思えば、RSA署名になるね。   

花子

そのとおり。


さらに違う場合もある・・・

太郎

よし!わかった!まとめるよ。 「メッセージのハッシュ値を計算して、それを秘密鍵で加工したものが署名」 「ハッシュ値と公開鍵と署名が、ある検証式を満たすかどうかで検証する」   

花子

RSA署名もエルガマル署名も、「メッセージのハッシュ値を計算する」部分と、「ハッシュ値を鍵を使って加工する」部分に分けられるので、後半の鍵を使う部分だけを「署名生成」と呼ぶ場合もあるけれど、これも、とっても紛らわしい。「署名生成=ハッシュ+署名生成」ということになり、右辺にも左辺にも「署名生成」が現れちゃう。

花子

慌てない、慌てない。実は、それも一般には正しくない。

太郎

えー? また違う場合があるの?

花子

そう。例えば、EdDSAと呼ばれる署名方式は、ハッシュ値を計算して加工、ではないタイプだね。署名を計算する途中過程で、メッセージと他の数値とを合わせてハッシュ値を計算するよ。実は、EdDSAは個人認証方式を元に作られた署名方式だよ。

太郎

何だか頭が混乱してきちゃった。

花子

洋服を作るのに使う繊維だって、羊の毛から作ったり綿の実から作ったり石油から作ったりするよね。原料が違えば製造方法も性質も違う。ディジタル署名も、公開鍵暗号を利用しているもの、個人認証を元にしているもの、そのどちらでもないものなど、色々なタイプがある。 全ての署名方式に共通して言えることは、署名生成では秘密鍵を使ってメッセージを加工する、署名の検証ではメッセージと署名と公開鍵が条件を満たしているかを確認する、ということと、大抵はハッシュ関数が利用されている、ということ。どのように計算するかは、タイプによっていろいろ。興味があったら、「簡単に言うと」ではなく、細かい仕組みを勉強してみると良いね。

太郎

うん、そうする。また分からないことがあったら質問するね!   

花子

いつでもいらっしゃい。

2022.4.13