公開鍵による暗号化とその本質

まぁ、最近はセキュリティ意識の高まりということで、サイトにSSLを導入するところが増えてきているが、大抵、導入する理由にせよ、SSLサイトを使うユーザーの認識というのは以下のようなものだろう。

SSL=暗号化=データが盗まれても読めないのでOK

というものである。
しかし、公開鍵と言われる仕掛けのなかで1つ忘れられている重要な点がある。それは、
「発信元を相互に保証出来ること」
である。単純な暗号化では、発信元は特定し難いのである。
要するにいい加減な発信元であっても、暗号化していれば安全ということはなく、暗号化する時の公開鍵が保証されていたり、そのサイトの身元が保証されることにある。

秘密鍵で暗号化したものは対となる公開鍵でしか複合化できない
公開鍵で暗号化したものは対となる秘密鍵でしか複合化できない

という2つの性質こそが重要なのである。
そして、公開鍵は身元保証されていることが重要なのである。

元文A→暗号文B(秘密鍵)
暗号文B→元文A(公開鍵)

元文C→暗号文D(公開鍵)
暗号文D→元文C(秘密鍵)

ある意味で、公開鍵で複合されてしまうという点で行くとスニフィング(覗き見)の恐れという点では、0ではないことは確かだ。SSLはもう少し複雑な手法で、よりスニフィングできなくしているが、ここでは話が複雑になるので、割愛する。本質として、お互いが、正しい相手としか「やり取り」出来なくなっていることが重要である。

たとえば、サイト(秘密鍵P)、ユーザー(公開鍵P)の間のやり取りとしよう。
サイトは「元文A→暗号文B(秘密鍵P)」が可能で、暗号文Bをユーザーに送る。そして、ユーザーは公開鍵で「暗号文B→元文A(公開鍵P)」となり、読むことが可能である。裏を返せば、サイトからの送信文自体は公開鍵をもっていればだれでも読めるので、スニフィングは難しくはないといえる。

ユーザーは「元文C→暗号文D(公開鍵P)」が可能で、暗号文Dをサイトに送るとする。 そしてサイトは「暗号文D→元文C(秘密鍵P)」で、秘密鍵Pを持つサイトのみが、もとの文章を読むことができる。
ここで、違うサイトが成りすましたとしても、秘密鍵Pは1つしかないので、違う秘密鍵であるQでは、元文を復号することは出来ないのである。

基本的に、公開鍵Pがやり取りしたいサイトのものであるということを何らかの形で保証さえできれば、その間の通信はスニフィングがされていても特定の相手との交信であると保証出来るのである。

このように、「暗号化して読めなくする」ということ以上に「通信相手を保証する」ということこそ、公開鍵の重要な側面の1つなのである。