定義
鍵をかける側と開ける側で、別々の鍵を使う暗号方式です。かける側の鍵は誰にでも公開し、開ける側の鍵は持ち主だけが保管します。そのため、一度も会ったことのない相手とも、秘密の鍵を事前に渡し合うことなく安全にやり取りできます。
メモを入れた箱の鍵は、どうやって渡すの?
友だちに、誰にも見られないようにメモを渡したいとしましょう。箱にメモを入れて鍵をかけて渡せばよさそうです。ただ、友だちもその箱を開けられなければ意味がありません。
そのためには、先に鍵を友だちに渡しておく必要があります。でも、その鍵を渡す途中の道が安全でなかったらどうなるでしょう。誰かが途中で鍵のコピーを作っていたら、その後のメモはすべて読まれてしまいます。
やり取りする相手が増えると、さらに大変です。クラスの20人それぞれと秘密のメモを交換するなら、違う鍵を20個も作って管理しなければなりません。鍵を配ること自体が、いちばん弱い輪になってしまうのです。
インターネットでも事情は同じです。初めてアクセスしたネットショップとは、事前に会って鍵を交換したことなどありません。この困りごとを解決したのが、「かける鍵」と「開ける鍵」を切り離すという発想です。
開いた南京錠をばらまけばいい
今度は、南京錠と鍵をペアで作り、南京錠だけをたくさんコピーして配るとしましょう。この南京錠は、誰でも持っていってかけることができます。その代わり、かけられた南京錠を開ける鍵は、私のポケットにしかありません。
私に秘密のメモを送りたい人は、私が配っておいた南京錠で箱に鍵をかけて送ればOKです。途中で誰かが箱を横取りしても、開けられません。南京錠をかけた本人でさえ、もう開けられないのです。
このとき、広くばらまく南京錠を公開鍵と呼びます。持ち主だけが保管する鍵は秘密鍵です。二つはペアで生まれますが、南京錠をいくら眺めても、現実的な時間内では鍵を割り出せないように作られています。
だから南京錠は、誰に渡しても大丈夫です。ウェブサイトも、アクセスしてきた人に自分の南京錠を最初に渡します。ただし、途中で誰かが自分の南京錠にすり替えるかもしれません。そのため、その南京錠が本物かどうかを確かめる仕組みが別に必要です。事前に会って鍵を分け合う必要は、なくなったのです。
もう少し正確に言うと
ペアになった二つの鍵は、ほかの仕事もできます。自分の鍵(秘密鍵)で、自分にしか押せないハンコをメモに押せるのです。私の南京錠(公開鍵)を持っている人なら誰でも、そのハンコが本当に私のものか確かめられます。メモの中身は隠れませんが、別の使い道が生まれます。
ハンコが正しいということは、私の鍵で押され、その後に内容も変えられていないという意味だからです。こうして送り主が本人だと確かめる仕組みを、電子署名と呼びます。秘密鍵が自分だけのハンコになるわけです。
ただ、この方式は処理が遅めです。大きなファイルをまるごとこの南京錠に入れると、時間がかかります。そのため今のインターネットでは、最初のあいさつのときに南京錠で相手が本物か確認し、そのうえで両者が値をやり取りして、同じ短い秘密の鍵をそれぞれ計算で作り出します。その後のやり取りは、その鍵ひとつで素早く行います。
ですから、今日ネットショップで決済するときも、この二つが一緒に動いています。ブラウザは、信頼できる認証局がそのお店の南京錠に押してくれたハンコ(証明書)で、南京錠がすり替えられていないかをまず確認します。そして、用意した秘密の鍵で残りのやり取りに鍵をかけるのです。南京錠でかけて送る方式は、公開鍵を使う代表的な方法のひとつです。
よくある誤解
公開鍵を他人に教えると、暗号が破られてしまう。
公開鍵は「かける」ための南京錠なので、広く知られても大丈夫です。南京錠を分解してみても、今のコンピューターでは現実的な時間内に開ける鍵を計算できないように設計されています。
公開鍵でかけた箱は、同じ公開鍵でもう一度開けられる。
かけた本人も、自分の手では開けられません。ペアになっている秘密鍵を持つ持ち主だけが開けられます。
日常で出会う場面
アドレスバーに鍵マークが表示されるサイトにアクセスすると、ブラウザがそのサイトの公開鍵と証明書を使って、本当にそのサイトかどうかを確認します。
メッセンジャーアプリの秘密のトークで、相手と自分だけが知る秘密の鍵を決めるときにも、この方式が使われます。実際のトーク内容は、その鍵でロックされます。
つまり ひとことで
かける鍵は誰にでも配り、開ける鍵は自分だけで持っておくことで、事前に会わなくても安全に秘密をやり取りできる方式です。