「コンピュータセキュリティを基礎から」というと、暗号の解説、特に共通鍵暗号と公開鍵暗号の違いからなどといった解説をよく目にする。昔は専門の方によって注意深く書かれていたのに対し、ここ何年かはひどい状況になっている。先月、宮崎で開かれたSCIS 2008の席でも暗号研究者の方々との雑談でそういう話になった。私は暗号は専門でないのでその話題は迂闊に書けないできたが、このところの巷の誤り解説の氾濫ぶりは目に余るものがある。
最もひどく蔓延っていてしばらく消えそうにない間違い解説の典型例は次だ。
このような共通鍵暗号方式の問題点を解決する暗号方式が、公開鍵暗号方式です。(略)つまり、公開鍵を使って暗号化した平文は、ペアとなっている秘密鍵によって復号化します。
「公開鍵は暗号化するための鍵で、秘密鍵は復号化するための鍵なのかな?」
いいえ、公開鍵は秘密鍵を逆に使って暗号化することもできます。秘密鍵を使って暗号化した平文は、ペアとなっている公開鍵を使うと復号化できます。電子証明書の基本的なはたらきはこの原理に基づいています。
電子証明書やデジタル署名で公開鍵暗号方式を使う場合には、送信したメッセージが本人のものであることを証明するために、本人の秘密鍵で署名を暗号化して、メッセージに埋め込みます。メッセージを受け取った人が、メッセージ中に暗号化された署名を対となる公開鍵で復号できれば、本人の作成したメッセージであることが証明されます。
これらの解説は誤っている。これらは、RSAアルゴリズムを説明するものにはなり得ても、公開鍵暗号方式を説明するものになっていない。公開鍵と秘密鍵が「逆に使える」というのはRSAアルゴリズムがたまたま(まあまあ)そうなだけであって、そのような性質を持たない他の公開鍵暗号方式がたくさん存在する。
断りなくRSAを前提に公開鍵暗号方式一般をこのように解説してしまうことが、どのくらいの重大な誤りと言えるのか、私は暗号が専門ではなくわからなかったので、暗号の専門家に確認したところ、少なくとも、前者については最初に発表された公開鍵暗号方式がその性質を持たないこと、後者については現に広く使用されている方式がその方法ではないことから、完全なる誤りと言ってよいとのことだった。
私はこうした指摘をずいぶん前にWebで見かけて知った。たとえば次などが、古くから公表されていて多く読まれた指摘ではないかと思う。
そもそも、『暗号化』と呼ぶ以上、それは(複数であっても構わないんだが)『特定の相手によってのみ復号可能』という条件が成り立っていて欲しいんだよね。ところが、公開鍵を不特定多数の相手に公開してしまってこその公開鍵暗号なんだから、『秘密鍵で暗号化』されたデータなどというものがもしあったとしても、それは誰でも復号ができる、つまり、暗号化されたと呼べるようなデータではまったくないわけ。で、正確を期すならば、『秘密鍵で変換されたデータ』程度に留めておかなければならないということ。
最近でも昨年、次の指摘があった。
この数日後に「IT用語辞典 e-Words」の公開鍵暗号の項目は訂正されたようだが、デジタル署名の項目は指摘に対応する訂正はされていない。「IT用語辞典 e-Words」はGoogleで検索したときにWikipediaに次いで上位に現れるサイトであり、こういったところに誤りが書かれていると、見よう見まねで書かれる解説で誤りが再生産されてしまう。
2006年に書かれた日経BPの「情報セキュリティ入門」にも同様の誤り解説がされている。
ポイント
●公開鍵暗号方式では,1人の利用者(ノード)に対して二つの鍵(キー)を作る。片方を「個人鍵」と呼び,もう片方を「公開鍵」と呼ぶ
●個人鍵は,作ってからその鍵ペアを使わなくなるまで,絶対に秘密に取り扱う。このため,秘密鍵と呼ぶ場合がある。これに対し公開鍵は,その名の通り,不特定多数のユーザーに公開して使う
●公開鍵で暗号化したデータは,そのペアの個人鍵でしか復号できない
●個人鍵で暗号化したデータは,そのペアの公開鍵でしか復号できない
この誤解はそうとう蔓延っており、訂正させても訂正させてもまた湧いてくるという勢いだ。
ところで、先月のSCISで話題になったのは、それに加えてさらに誤り満載なある日経BPの連載記事の話だった。
デフィーの着想は,鍵を2種類に分けるというものでした(図2)。一つめの鍵は,それまでと同様に大切に扱う鍵で「秘密鍵」といいます。もう一つの鍵は「公開鍵」です。秘密鍵があれば,ある手順により公開鍵を容易に作り出せます。しかし公開鍵から秘密鍵は作り出すことができない,もしくは作り出すのに天文学的な時間が必要となるというものです。
この秘密鍵と公開鍵はペアで不思議な動作をします。(略)今度は秘密鍵で宝箱を閉めてみます。すると,今後はそのペアとなっている公開鍵でなければ箱は開きません。箱を閉めた秘密鍵を使っても箱は開かないのです。不思議な箱と不思議な鍵です。デフィーとヘルマンはこの仕組みで,鍵交換問題をどのように解決したのでしょうか?(略)
(略)
RSA暗号
デフィーとヘルマンのアイデアは画期的で素晴らしいものでしたが,実際に「秘密鍵から公開鍵を作るのは容易だが,その逆は困難である」という鍵をどうやって作るのかという問題がありました。(略)
問題を解く最初のステップは,与えられた数を2つの数に因数分解することです。これ自体はさほど難しくありません。難しいのは,その因数が素数であるかどうかの判定です。
Nが素数であるかどうかを検査する方法として,√Nまでの素数で次々と割り算してみるというのがあります。しかし,「nより小さな素数は,およそ n/log(n)個ほど存在する」(素数の定理)ため,10進数で150けた程度あるNが素数かどうかを判定するには,10進数で70けた以上の個数の素数をラインナップして割り算をしなければなりません。現在のコンピュータでは,この計算が終了するまでに太陽が燃え尽きているということになります。
(略)
D-H鍵交換アルゴリズム
(略)Diffie-Hellman鍵交換アルゴリズム(略してD-H鍵交換アルゴリズム)を図9にまとめています。このアルゴリズムは「数は累乗するより対数(累乗の逆演算)を計算する方が難しい」という原理に基づいています。
ハッシュ関数とは,何らかの数値が入力されて,何らかの数値が出力される仕掛けの一つです。同じ数値を入力する限り,必ず同じ数値が出力されます。(略)そこでperlやJavaのような言語では,ハッシュ・テーブルを使うことができます。ハッシュ・テーブルは、(略)
(略)
この暗号化されたハッシュ値を「MAC」(Message Authentication Code)といい,特にハッシュを使っていることからHMACともいいます。受信側でも,受け取ったメッセージのハッシュを計算し,一方でMACを復号化してみて計算したハッシュと一致すれば,メッセージは改ざんされていないと分かります。
公開鍵暗号では,「秘密鍵」と「公開鍵」の2つの鍵をペアにして使います。この2つの鍵は,次の2つの性質を持っています。
性質1)秘密鍵から公開鍵は容易に生成できるが,その逆は非常に困難(図1)。
性質2)秘密鍵で暗号化した情報は,そのペアである公開鍵でなければ復号化できない。また公開鍵で暗号化された情報は,そのペアである秘密鍵でなければ復号化できない(図2)。
(略)
特に第3回の記事は多重に間違っているためどういう間違いをしているのか説明しにくい。私は暗号は専門でないので正確に間違いを指摘する自信がない。この連載に対しては、少なくとも2名の方による間違いの指摘がWebに書かれた。
後者の方は日経IT Proに指摘を送ったそうだが、記事に訂正はないようだ。前者の方の指摘は、わかっている者同士ではこれはひどいよねと認識を共有できても、間違いだと知るべき肝心な読者にはこの声は響かない書き方だと思う。私も何度か自分で書こうとしたが、専門外のことについて誤りを指摘する文はやはり書けない。
こうしたことは真正面から専門の方々にもっと指摘されたらよいのにと思う。必要な読者に読まれる形で。
一般的に言うと、専門家が非専門家の誤りを指摘するというのはなかなか難しい作業である。非専門家の読者の関心を集めるように書かなければそもそも読まれない。どのような誤解に基づくものかを見いだして指摘する必要がある。「専門家の視点と一般向けの視点は別なのですよ」というありがちな言い訳をされないように注意しなければならない。重箱の隅をつつく揚げ足取りと思われないようにし、過剰な指摘をしないよう注意しないといけない。加えて、感情的に反発されないように配慮しないと書けないと考える人もいるだろう。専門家であるが故に、指摘でミスをすれば職業上の信用を失うことになりかねず、慎重になってしまう。
blogの普及と認知はそうしたことをやりやすくしたのだと思うが、日本では暗号研究者によるblogはまだとても少ないようだ。
■1 暗号化と署名は対称じゃないよという話 高木浩光@自宅の日記 - 公開鍵暗号方式の誤り解説の氾濫をそろそろどげんかせんとより。 これらの解説は誤っている。これらは、RSAアルゴリズムを説明するものにはなり得ても、公開鍵暗号方式を説明するものになっていない。..
高木浩光@自宅の日記の『公開鍵暗号方式の誤り解説の氾濫をそろそろどげんかせんと』を読む。
確かに誤った情報は流れないに越したことはないのだけど。暗号なんかの分野になると...