公開鍵暗号

今日は暗号の話を書きます。

 暗号はとても歴史が古く、仮にも何か書こうとする者なら必ず身に付けていなければならない技術の一つでした(検閲やその後の火あぶりなんかをあまり意識し無くなったのはそう昔のことではありません)。また一方、秘密の通信をしたり、それを解読したりというのを延々繰返し、そのために数学者を雇ったりコンピュータを発明したり、人はいろいろしましたが、大体1970年代あたりに「新しい暗号」が登場しました。公開鍵暗号という奴です。
 これまでの暗号は、いわば「閉める(暗号化する)鍵」と、「開ける(解読する)鍵が同じ暗号」でした。暗号通信をする両者は、同じ暗号鍵を持っていなければなりませんでした。新しく登場したこの暗号は「閉める鍵と開ける鍵が違う暗号」でした。
 このへんてこな暗号が生まれたのは、ネットワークでの必要性からです。ネットワークというのは畢竟、「ルールを共有する、たくさんの赤の他人の集まり」です。これはなかなかにへんてこなものでした。普通、赤の他人はルールなんか共有しませんし、「出会いもしないのにルールなんかない」のが当然でした。ルールは、すでに「繋がってる」人同士の間にのみあったのです。そうして、ネットワークというのは、「赤の他人なのに繋がってる」ということでした(参加する以上最低限のプロトコルは共有してしまってる訳ですから)。

 ネットワークでは通信(コミュニケーション)します。秘密通信したくて、ネットワークで従来の暗号を使うとどういうことになるか考えてみましょう。
 「送り先以外には誰にも読まれたくない手紙」は、どうやって送ればよいでしょう?
 不特定多数と暗号通信するためには、不特定多数に(そして不特定多数同士が)自分達の通信で使う暗号鍵を送り合うことが必要です。前もってネットワーク上の全員に暗号鍵を割り当てることを考えてると、n人のネットワークなら、nC2個の暗号鍵が必要ということになります。これは暗号鍵を作るだけでも膨大な手間です。
 さらに暗号鍵を送ることを考えると更なる困難にぶちあたります。
 AさんからBさんに手紙(暗号文)を送るとします。
 AさんとBさんは、あらかじめ同じ暗号鍵を持ってないといけません。AさんとBさんが、同じ機関から派遣されたスパイなら何の問題もありませんが(あらかじめ申し合わせておけば良いのです)、ネットワークでは、AさんとBさんは(何の申し合せもない)「赤の他人」です。
 結局、はじめての暗号通信をするためには、どちらかから相手へ「この暗号鍵でいきます」と言って、暗号鍵を送らないといけません。
 AさんがBさんに送ってもよいのですが、通信をわざわざ暗号で送らなければならないくらいなのに、当の暗号鍵を送るなんて危険じゃないでしょうか(暗号化して送ればいいって?じゃあ、そのための暗号鍵はどうするんだよお)。
 では、BさんからAさんに暗号鍵を送ってもらうようにしましょうか。でも、見も知らぬAさんに、Bさんは自分の大切な暗号鍵を送ってくれるでしょうか?AさんはどうやってBさんに信用してもらえばいいのでしょう?第一、BさんからAさんへ暗号鍵を送るときも、さっきと同じ危険があります。
 結局、ネットワーク以外の方法で前もって、AさんとBさんはコンタクトを取るしかないのでしょうか(いったい、何のためのネットワークなんだ!?)。その「ネットワーク以外の方法」にしたところで、ネットワークの問題をそのまま引き継いでることは十分考えられます(もう何も信じられない!)。メタ・ネットワークは、結局ネットワークなのです。
 もうひとつ方法はあります。ネットワークの住民=「ルールを共有する赤の他人」は、「誰かに送る手紙はすべて中継センターを介して送ること」というルールに従えばよいのです。そうすれば、誰もが対中継センターとの暗号通信に使う暗号鍵だけを持っていればよいことになります。
 確かに効率があがるけれど(暗号鍵はn人のネットワークならn個でOKです)、しかしこれは「送り先以外には誰にも読まれたくない手紙」に、例外を認めることになります。中継センターは絶対者です。ネットワーク上のすべての暗号通信を仲介し、故にすべての暗号通信を何の苦労もなく「盗み見」することが可能です。我々はそんなにも「中継センター」を信用することができるでしょうか?いったい誰が「中継センター」をするのでしょうか?
 「いったい誰が「中継センター」をするのでしょうか?」には、もうひとつの側面があります。すべての(暗号)通信を「中継センター」が仲介するならば、その仕事は莫大なものになります。すべての労力と責任と情報と権力とが、「中継センター」に集中するのです。
 電話をかける時も、政治的発言をするときも(もちろん商業ネットで今してるようにパソコン通信する時だって)、我々は現にそういうタイプのネットワークの住人なのですが、それはそんなにあたりまえのことではないと思います。

 ネットワーク上でのこのような困難が、新しい暗号「公開鍵暗号」ではどのようにかわるのでしょう。
「公開鍵暗号」で暗号文を送るときは、次のようにします。すなわち「公開鍵でかける→送る→非公開鍵で開ける」。
 AさんからBさんに手紙(暗号文)を送るとします。
 Aさんはまず「公開されているBさんの鍵(Bpublic)」で、送りたい文を暗号化します。ここでBpublicは、暗号文作成用です。これは(ネットワーク内の人なら)誰でも入手することができるし、これは誰もがもっているのと同じことです。したがって、だれでも「Bさん宛の暗号文」を作ることができます。
 そうしてAさんは、暗号文をBさんへ送り付けます。
 Bさんは、「公開されてないBさんの鍵(Bsecret)」で、送られてきた暗号文を解読します。ここでBsecretは、暗号文解読用です。これはBさん以外誰も持っていないから、暗号文をBさん以外に読まれる心配はありません。
 つまり「公開鍵暗号」は、「かける(暗号化する)鍵」と「あける(解読する)鍵」を分けることで、暗号鍵(かける鍵の方)を公開することを可能にしました。(全部、公開したら暗号じゃなくなります)。そのことで、ネットワーク上での暗号通信でこれまでの問題だったことを、
1.公開なので、n人がそれぞれ対n−1人用のそれぞれ別の暗号鍵を用意する必要がない。でもって作る手間が省ける(n人のネットワークだと公開鍵、非公開鍵と作っても2nですむ)。
2.「鍵を送る」ことにまつわる(先ほど述べたような)様々な危険を回避できる。
というわけで、まんまと解決したわけです。

 しかし好事魔多し。別の危険が生まれました。
 今や、(公開鍵でもって)誰もが暗号文を送ることができます。ということは、偽造文を、Aさんのふりして送ることができるのです。「盗み見」することはできませんが、「改竄」「すり替え」と同じことが、誰にでもできるようになってしまったという訳です。
 以前は、暗号鍵を共有している当事者間での暗号通信であったので、(「暗号鍵が漏れた・ばれた」を疑わない限り)「誰が送ってきたのか」という認証の問題は発生しませんでした。

 しかし「公開鍵暗号」は、ネットワークにおける認証の問題についても、すばらしい手段を提供してくれました。
 要は逆に考えればよいのです。非公開鍵は自分だけしか持っていないのだから、それでもって鍵をかければよい(暗号化すればよい)という訳です。もちろん、これはもはや暗号とはいえません。公開鍵で誰にでも開ける(誰にでも読める)からです。
 「非公開鍵でかける→送る→公開鍵で開ける」
 しかし、「Aさんの非公開鍵(Asecret)」でかけたものは、「Aさんの公開鍵(Apublic)」でないと開かないし、なおかつ誰にでもApublicによって開くことができます。これは、「その文を作って送ったのは(少なくとも暗号化したのは)間違いなくAさんである」ということを、《誰でも確認》できるということです。これはいわばネットワーク上のハンコ(電子捺印)です。
 ネットワーク上という「ルールを共有する、たくさんの赤の他人の集まり」では、「通信の秘密」も大切ですが、「私がAという人物であることを、間違いないと他の皆に認めてもらうこと」=「個人の(相互)認証」だって大切です。原理上、誰にでもなりすますことができるからです。
 通常、通信(コミュニケーション)を「中継センター」を介しておこなうネットワークでは、「個人の認証」も「中継センター」の仕事です。個人は対「中継センター」の通信(コミュニケーション)において、自分自身を証明することを要求される(ID,パスワードの要求)。それをクリアーすると、「中継センター」はその個人を「認証」します。「認証」以後、「中継センター」は、すべての通信内容にID(個人識別番号)を付して、その通信内容が当該個人に属するものであるという「お墨付き」を与える、つまり「個人の認証」について全責任を負うという訳です。
 かくして、「認証」の問題について(我々はネットワーク上にいるにもかかわらず)、とても無関心でいられました。

 一旦、「認証」の手段が確立すれば、それを暗号通信にも応用することができます。つまり、暗号文をそのまま送らずに、自分の署名と「捺印」を付けて送れば、「確かにAさんからの暗号文だ」と分るわけです。
 AさんからBさんへ、公開鍵暗号方式で、署名捺印付きで暗号文を送るとしましょう。
 まずAさんは、Bpublicで送りたい文を暗号化します。しかるのち自分の非公開鍵(Asecret)で、それをまた暗号化します。そして署名する(名前をつけておく)。そうしないと誰から送られてきたかわからないし、誰の公開鍵暗号で開けたらいいか、わからないからです。もとの文は二重に暗号化されている訳です。
 「外側の暗号」は、誰にでも開けることができます。それをApublicで開けることで、誰でも(もちろんBさんも)それがAさんからの暗号文であることがわかます。しかしその中身ももう一重に暗号化されていて、この中身はBさんでないと(つまりBsecretを持っていないと)開いて見ることはできません。

 この、確かに当人であると「確証」できても、暗号文は読めない、というのは使えます。たとえばネットワークを使った「電子選挙」は、次のように行うことができます。
 まず選挙管理者を、名簿対照係と開票係に分けます。ふたつの係のそれぞれの公開鍵をMpublicとKpublicということにしましょう。
 投票者は、投票内容を、まずKpublicで暗号化して、それを自分の非公開鍵Asecretで暗号化して名簿対照係に送ます。
 名簿対照係はApublicで解読して、確かにそれがAさんの投票であることを確かめた後、解読したものを開票係に送ます。同時に受け取りの代りに、それをMsecretで暗号化したものを、投票者Aに送り返す。投票者Aは名簿対照係の公開鍵Mpublicでそれを解読してそれが名簿対照係から送られてきたものであることを確認し、さらに以前Kpublicで暗号化したものと同じであることを確認して、確かに自分が送ったものであると確かめます。
 開票係は、名簿対照係から回ってきた投票を(これはAさんによる電子捺印はすでに名簿対照係によってはずされているので無記名投票である)、自分の非公開鍵Ksecretで解読して、投票を集計します。
 この方式の問題は、名簿対照係と開票係が結託すれば元も子もないことですが、公開−非公開鍵を使ってこの問題を回避する方法もあります。〔中断〕

(注)この文章には、いつものとおり、一部フィクションがあります。
inserted by FC2 system