盗聴され放題なシステムを使いながらも、それでも秘密の通信をしたいのであれば、情報を暗号化してやり取りすればよい事になります。
コンピュータにとっては、文書だろうが何だろうが、全ての情報はデジタル化された数値として扱っています。
とある数字を、とあるルールに従って別の数字にしてしまえば、元に戻す方法を知らない人には情報が漏れる事がありません。
とある数字を、とあるルールに従って別の数字にする…これは関数に他なりません。
ここでは理解を簡単にするために、とある世界では暗号化の関数に「×」(掛け算)(乗算)が使われるのが決まりだと仮定しましょう。
相手に「7」と言う数値を送りたいとします。暗号化の鍵には「2」を使用するとすれば、
と言う事で、相手には「14」と言う数値を送ればいいと言う事になります。間で盗聴している人にとっては、鍵が「2」である事がわからない限りは、内容が「7」である事がわかりません。
「14」と言う暗号化された数値を受け取った人は、これを元の状態に戻さなければなりません(復号化)。
手許にあるのは、「14」と言う暗号化された情報と「2」と言う鍵です。元に戻すには「×」の逆関数である「÷」(割り算)(除算)を使えばいい事になります。
これで、「7」と言う情報が、途中で盗聴される事なくちゃんと相手に届ける事が出来ました。
所で、上の例では「2」と言う鍵をどうやって相手に送ればいいのでしょうか?
「14」と言う暗号化された情報と一緒に送っても意味はないですよね。(盗聴者に復号化されてしまいます)
あらかじめ最初から鍵を「2」と決めておけばいいのでしょうが、相手はいつも同じ人とは限りません。もしかしたら初めての相手かも知れません。
では、別々に、ひと呼吸置いてから送ればいいのでしょうか? 相手に届くまでの経路がその都度変化するのがインターネットの特徴とは言え、必ず前回と違うルートで届く保証など、どこにもありません。途中の経路にいる盗聴者に、暗号化された情報と鍵の両方を入手されてしまう可能性はあります。
だったら、郵便で送りますか? 電話で送ればいいんでしょうか? …これでは何のためにインターネットを使っているのかわかりませんね。
これでは不便で仕方なく、実用的ではないため、インターネットの世界で使用するための暗号化方式として「公開鍵暗号方式」と言うものが開発されました。
「14」と言う暗号を「7」と言う情報に戻すために、先程は「2」と言う暗号化した時の鍵を使って「×」の逆関数である「÷」を使いました。
でも「14」から「7」を導く方法は割り算だけではありませんよね。例えばこんな方法でも複合化出来るはずです。
この例では、暗号化した時と同じ関数を使って復号化しました。「2」と言う暗号化した時の鍵に代わって「0.5」と言う鍵を使って複合化しています。
そう、逆関数を使わずに、暗号化と複合化で同一の関数を使う時、暗号化する鍵にはペアになる複合化する鍵が存在する事になります。(中にはペアが存在しない関数もありますが、その様な関数は採用しません)
ここでは説明を簡単にするために関数に掛け算を使っているので、「2のペアは0.5」だと言う事は簡単にわかります。しかし実際には大変に複雑な関数を使っているため、ペアになる鍵がどんな数値になっているのかを知るためには、スーパーコンピュータで何年もかかって計算しなければなりません。
この、ペアになっているふたつの鍵は、どちらで暗号化しても、もう片方で複合化する事が出来ます。とりあえず片方を「誰にも明かさない秘密の鍵」(秘密鍵)、もう片方を「みんなに知らせる公開の鍵」(公開鍵)と決めてしまい、公開鍵を「これは私の鍵です」とみんなに知らせてしまいます。
ここでは「2」を公開鍵に、「0.5」を秘密鍵にしましょう。
まず最初に情報の受け取り手は、情報の送り手に自分の公開鍵が「2」である事を伝えます。情報の送り手は、受け取った公開鍵を使って情報を暗号化します。
「14」と言う暗号を受け取った受け取り手は、自分の秘密鍵「0.5」を使って暗号を復号します。
インターネットでやり取りされるのは、「14」と言う暗号と「2」と言う公開鍵です。途中経路で盗聴している人には、復号するための秘密鍵がわからないため、この暗号化された情報を見る事が出来ません。
もちろん、この公開鍵暗号方式も万能ではありません。
ペアになる鍵が何になるのか、それはスーパーコンピュータで力技で解析すれば、必ず解明出来ます。ただ、とんでもない労力が必要だと言うだけの話です。
その労力をかけても手に入れる価値がある情報なのかどうか…もしも価値に見合わない途方もない労力を必要とするなら、暗号を解析しようなんて思う奴はいないだろう…解析の難しさが安全の担保になっているのです。
(具体的には「ある程度の桁数になると、その数字の約数を割り出すのがとてつもなく大変になる」と言う理論から、片方の鍵からもう片方の鍵を割り出すのが難しいと言われています。一方、どれだけ桁数が多くても倍数を計算するのはとても簡単なので、ペア鍵の生成は一瞬で済みます)
時間さえあれば解析は可能である…だから、自分が持っている秘密鍵と公開鍵のペアは、数年に一度取り換えなければ安心は出来ません。
「努力すれば解けてしまう暗号では安心出来ないではないか」と言うそこの完璧主義者のあなた、それは心配のし過ぎです。心配してもしなくても、元々この世の中には解けない暗号は存在しません。あらゆる暗号は必ず解く事が出来ます。ただ、解くのに何年もかかる様だと、バカバカしくて解く気にならない、と言う事なんですね。
公開鍵と秘密鍵のペアは、その辺のフリーソフトで作り出す事が出来ます。その作り出した鍵の中から気に入った物を自分の公開鍵と秘密鍵に決めてしまえば、とりあえずはそれでインターネットでのやり取りを暗号化する事が出来ます。
ただし、一般的にはこの様な好き勝手に作られた鍵を使ってのデータのやり取りは、ほとんど行われていません。
直接面識がある者同士がインターネットを介してデータのやり取りをするならそれでもいいのでしょうが、一度も会った事のない者同士がいきなり公開鍵を交換し合ったとしても、盗聴される心配こそなくなるものの、「今相手にしている人は、本当に本人なんだろうか?」と言う不安がつきまといます。
通常は、権威ある所が鍵を作成して分け与え、暗号通信に使ってもらうと同時に、その鍵の持ち主の身元を鍵の発行者が証明すると言うサービスを行っています。
この鍵の持ち主の身元証明を行う発行者の事を、認証局と言います。
公開鍵を受け取った人は、その鍵を発行した認証局に、その鍵の持ち主がどこの誰であるか問い合わせる事が出来るのです。
ただし、認証局と言っても、海のものとも山のものともわからない認証局も数多く存在します。その認証局がどれだけ信頼出来るのかは、鍵を受け取る側でいちいち判断しなければなりません。
インターネットで色々なデータをやり取りしていると、実に沢山の認証局とやり取りをする事になります。それらの認証局のどれが信頼出来てどれがうさん臭いのか、いちいち判断していたのではたまったものではないので、通常は「私が信頼した認証局が信頼している認証局は、信頼してもいい」と言った判断が行われています。
これを行うと、格調高い認証局は格調高い認証局同士で信頼し合い、うさん臭い認証局はうさん臭い認証局同士で信頼し合う様になり、信頼している者同士の認証局のレベルが大体揃う様になります。
私達の社会保険労務士認証局は、厳密な審査をして鍵の発行を行っています。(住民票と印鑑証明書を提出させて本人である事を確認し、社会保険労務士名簿に基づいて電子認証を発行し、書留で送る事により確実に本人に鍵を届ける)それによって総務省の認証局(政府認証基盤ブリッジ認証局)(日本のトップレベルの認証局)の信頼を獲得し、その信頼を維持しているのです。
総務省の認証局はまた、厚生労働省認証局を信頼しています。
私達の社会保険労務士認証局は、厚生労働省認証局と直接の信頼関係はないのですが、どちらも総務省の認証局に信頼されている認証局なので、安心してお互いを信頼する事が出来るのです。