IT系サラリーマンの社会的 blog

社会に対して思ったことを書いてます

デジタル署名の「秘密鍵で暗号化」は間違いなのか

先日、デジタル署名の説明において「秘密鍵で暗号化」という表現は間違いだというツイートを見かけた。

私は「秘密鍵で暗号化」に全く違和感がなく、そしてセキュリティ分野で有名で尊敬できる方がそのように主張されていたので非常に驚いた。それからというもの、その理由や解説をいろいろ調べてみた。そして、これは意外と根深くて複雑な議論になっていることが分かった。

本ブログでは、いわゆる「秘密鍵で暗号化」を調べて分かったことや自分なりに整理したことなどを記していく。

デジタル署名の説明の現状

先にこの議論に対する私の意見を述べると、「秘密鍵で暗号化」と説明してもあながち間違いではないと思っている。(そして、可能な限りその前提を説明する必要がある。)

インターネットで「デジタル署名」を検索するといろいろなサイトでデジタル署名のことが解説されているが、政府機関のサイトはもちろんセキュリティ業界で有名な大企業のサイトでさえも「秘密鍵で暗号化」という表現を使っている。そして、セキュリティに関する本でさえもそのような表現が散見されているらしい。

秘密鍵で暗号化」の一例:

法務省:電子署名法の概要について

デジタル署名を少ししか勉強していない人には「秘密鍵で暗号化」が間違っていることに気がつかないだろう。もちろん私も最初は分からなかった。

この議論に関連してある人の日記によると、2008年に書かれたものにはなるが当時のセキュリティ専門家たちの間でも少し話題になっており見かけたらなるべく訂正しようとしている旨の記載があった。つまり、セキュリティ専門家たちから見てデジタル署名の「秘密鍵で暗号化」は明らかな間違いだと認識されているのである。

高木浩光@自宅の日記 - 公開鍵暗号方式の誤り解説の氾濫をそろそろどげんかせんと

ここでデジタル署名を説明する。

  • 電子署名とデジタル署名は意味が異なる違う用語である。
  • 電子署名とは、電磁的記録の改ざん防止、改ざん検出のために用いられる技術全般のことである。
  • デジタル署名とは、改ざんを検出するために用いられる技術の中で特に公開鍵暗号方式(公開鍵と秘密鍵)による署名のことを指す用語である。

デジタル署名は一般的に以下の3つのアルゴリズムから成る。

  • 鍵生成アルゴリズムG(Generate) - 鍵のペア(PK, SK)が生成される。PKは公開鍵、SKは秘密鍵である。
  • 署名生成アルゴリズムS(Sign) - メッセージmと秘密鍵SKを入力とし、署名σを生成する。
  • 署名検証アルゴリズムV(Verify) - メッセージm、公開鍵PK、署名σを入力とし、出力は承認または拒否の2値である。

まとめると、鍵のペアを生成する必要があること(公開鍵暗号方式)、最後の出力は承認または拒否の2値であることが特徴的なので理解してほしい。

デジタル署名(公開鍵暗号方式)でよく使われるアルゴリズムは以下のとおりである。

  • RSA
  • DSA
  • ECDSA
  • EdDSA
    • etc.

RSAアルゴリズム以外にもいろいろあるということを覚えてほしい。

いろいろ調べてみて私としてはこの議論についてある程度納得するところまで理解できたと思っている。

そして「秘密鍵で暗号化」は間違いだと主張する人とそうではない人(つまりその表現を使い続ける人)の両者の気持ちをある程度理解できるようになったとは思っている。

そのような観点で私なりにもう少し深掘りしてみる。

なぜ「秘密鍵の暗号化」は間違いなのか

秘密鍵の暗号化」は間違いだと言う人曰く、

  • 「暗号化では公開鍵で暗号化するが、署名では逆に秘密鍵で暗号化する」といった感じで署名は暗号化の逆変換だとよく説明されるが、それは間違いである。逆変換ではない。意味という観点において、秘密鍵と公開鍵を逆にするというのは意味不明なことであり間違っている。
  • 秘密鍵と公開鍵を逆にできるのはRSAアルゴリズムだけであり、たまたまRSAアルゴリズムがそうなっているだけである。
    他の署名アルゴリズムでは通用しない。他の署名アルゴリズムでは秘密鍵と公開鍵を逆にするといったことはしていないし、そもそも暗号化処理をしていない。
  • 暗号化と署名は異なる概念であり、署名において暗号化というのは意味がなく暗号化という説明は意味不明である。

ここでは上記の考えを持つ人を、デジタル署名の「秘密鍵の暗号化」は間違い主義者と呼ぶことにする。

私なりに彼らの主張を補足したいと思う。

  • 説明サイトのほとんどは、電子署名の説明と言いつつRSAアルゴリズムのことを説明している。そして、暗号化のRSAアルゴリズムに引きづられてしまい、その結果「秘密鍵で暗号化」という署名の基本的な説明としては間違ったものになってしまっている。
  • 暗号化と署名は異なる概念である。現在の多くのサイトの説明は、それらを混同してしまって間違っていると言わざるを得ない。ある意味、RSAが紛らわしいのが原因ではあるが。
  • メッセージmを「暗号化」する必要はない。なぜなら署名(≒秘密鍵で暗号化されたハッシュ値)と一緒に平文のメッセージmを送信しているからである。受信者であれば、わざわざ復号しなくても平文はすでに分かっているのである。さらに復号に必要な鍵情報は公開鍵なので、誰でも復号できてしまう。これは暗号化の概念を大きく逸脱している。
  • すなわち、署名の説明において暗号化/復号という用語を用いることは意味不明なのである。

一先ず箇条書きでいろいろ書いてみた。自分の説明スキルでは分かりやすく説明することは非常に難しいが、伝えたかったニュアンスはある程度理解してもらえたであろう。多分

この議論を理解する上で一番重要なことは、暗号化と署名は異なる概念であると理解することである。

なぜ「秘密鍵で暗号化」は正しいのか

デジタル署名を少し勉強した人は、残念なことに「秘密鍵で暗号化」だと覚えてしまったかもしれない。私もその一人である。

そのような人がこの議論を理解する上で必要な前提あるいはよくありがちな勘違いを説明する。

しかし、上記のことを正確に理解しているにも関わらず、デジタル署名で「秘密鍵で暗号化」という表現を使い続ける人がいるように思われる。

おそらく、下記のように考えていると推測している。

  • RSAアルゴリズムの使用を前提として、実際の実装上あるいは処理上は「秘密鍵で暗号化」である。
  • RSAアルゴリズムにおいて、秘密鍵と公開鍵を逆にしても期待される出力結果には問題がない。
    「暗号化は公開鍵で暗号化。署名は逆に秘密鍵で暗号化」という説明は雑ではあるが、間違いではない。
    実際の実装でもそうなっており正しく動作して正しい値が出力されているので、特に問題はない。
  • デジタル署名を説明する上である程度分かりやすくそして簡潔にするためにも、「秘密鍵で暗号化」と説明しているに過ぎない。暗号化と署名は異なる概念であることは十分に理解している。

もう少し勝手に補足すると、間違いだと指摘するのであればどんな風に分かりやすく簡潔に説明すればいいのか、対案を出してみろということかもしれない。

おそらく、デジタル署名の「秘密鍵の暗号化」は間違い主義者はこう説明するであろう。(RSAアルゴリズムの使用を前提として)

(だれかさん) 署名とは何ですか?「署名」の説明に「署名」を用いるのはナンセンスです、意味不明です。

(デジタル署名の「秘密鍵の暗号化」は間違い主義者) 分かりました。下記のとおり訂正します。(RSAアルゴリズムの使用を前提として)

  • 秘密鍵で暗号化する。しかし、ここでいう暗号化は暗号化のことではない。

わざと可能な限り誇張して補足してみたが、私個人としては「秘密鍵の暗号化」と説明したくなる気持ちもなんとなくだが分かった気がしている。

もちろん、1時間以上かけてデジタル署名を説明してもいいだろう。(説明を受ける側にそこまでの価値があるかどうかは定かではない。)

重要なことは、暗号化と署名は異なる概念であると理解することである。

秘密鍵で暗号化」にある根本的な何か

秘密鍵で暗号化」という表現を使う人にとって、電子署名といえばRSAアルゴリズムであるという思い込みがあるようには感じる。

もちろん実際はそうではない。

冒頭に示した法務省による電子署名の説明は、普通はもっと一般的で抽象的なレベルで説明すべきところ、「秘密鍵で暗号化」と書いてあるのでRSAアルゴリズムによる公開鍵暗号方式による署名だということが分かる。

これは不適切である。

署名アルゴリズムRSAアルゴリズムだけではないし、RSAアルゴリズムの場合というような注釈もない。

法務省が管轄の電子署名法において使用可能な署名アルゴリズムRSAアルゴリズムだけだと明言されていればあながち間違った説明ではないが、ほぼ間違いなくそう書かれていないだろうし実際の使用においてはECDSAなどのアルゴリズムも使われているだろう。

電子署名は電磁的記録の改ざん防止、改ざん検出のために用いられる技術全般のことであるのに、急にRSAアルゴリズムのことを説明するのは明らかなミスリードである。

この世の中には署名アルゴリズムRSAアルゴリズムだけしか存在しなくて「秘密鍵で暗号化」するものだと誤解されてしまい、挙げ句の果てにECDSAアルゴリズムの説明でも「秘密鍵で暗号化」と説明されてしまう可能性がある。

このようなことは、注釈や前提などにRSAアルゴリズムを使用した場合の例と書くだけで解決する話である。適切に前提や前置きを記載する必要がある。

まとめ

デジタル署名で「秘密鍵で暗号化」という表現を使う際は以下のことを理解してほしい。

  • 暗号化と署名は異なる概念である。
    • それでも署名の説明に暗号化という表現を用いる意味は何なのか
  • 署名アルゴリズムRSAアルゴリズムだけではない。
  • デジタル署名で「秘密鍵で暗号化」という表現は可能な限り避けるべきである。
    • 用法・用量を守って正しくお使いください
    • 前提・前置きなどで丁寧に説明する必要がある

その他

秘密鍵で復号

秘密鍵で暗号化」は間違いで、「秘密鍵で復号」が正しいという表現を見かけた。

こちらも調べてみたが、個人的にはさすがにこれは言い過ぎだと思う。

単純に非常に分かりづらい。やはり、署名と暗号化(復号)は異なる概念である。

実はデジタル署名のWikipediaに「hash-and-decrypt」という文言が残されている。

デジタル署名 - Wikipedia

ずっと昔はそのような議論があったかもしれない。

現在は、調べた限りおそらく誰もそのようなことは言っていないようである。

あと、デジタル署名の「秘密鍵の暗号化」は間違い主義者が「秘密鍵で暗号化」としているのはなぜなのかは気になっている。

個人的には鉤括弧の範囲を単に「暗号化」としてもいいのではと思っており、わざわざ秘密鍵のところまで含めている理由は正直よく分かっていない。おそらく暗号化のRSAアルゴリズムの「公開鍵で暗号化」と対比させるためかもしれないと推測しているが、確証は全くない。

RSAアルゴリズムの今後について

ウェブブラウザでアクセスしているサイトのサーバ証明書を確認できるが、時々署名アルゴリズムがECDSAであるものを見かける。

それに、RSAアルゴリズムがそろそろ限界かもしれないという記事も見かける。

近い将来RSAアルゴリズムがほとんど使われなくなった場合に「秘密鍵で暗号化」という表現はどうなっていくのだろうか。

最後に

私個人の意見としては、「秘密鍵で署名」でいいのでは。