公開鍵暗号の仕組み

久しぶりにブログを書いてみようと思って書いています。
ハローハロー🌞

今日は暗号技術について紹介しようと思います。

f:id:ingentity:20190920180920j:plain

暗号技術とは

暗号技術はその名の通り、文章を暗号化するための技術です。

例えば、アリスさんがインターネットチャットでボブさんに次のようなメッセージを送ることを考えます。

「ハロー、私アリス。電話番号は090xxxxxxだよ。プリーズコールミー」

アリスはボブにだけ自分の電話番号を教えているつもりですが、もしこのメッセージが暗号化されていなかった場合、メッセージを盗聴され、電話番号がボブ以外の人に知られてしまう可能性があります。
f:id:ingentity:20190920181657j:plain

それを防ぐためにはアリスはメッセージを暗号化する必要があります。
実際に暗号化するとメッセージは次のようになりました。

「91Mk8XDdkGm4ze2mih7yW16+REDBoS7FCqHVnQACvUGc45AfqGuUYeoRWFs+4i4Tc083rvN1HAVhj9OglxPCVRuLMQ4M6hWgK3oDEnFqR2qYazfF3R9kwA0B53xGoez0」

メッセージが暗号化されていれば、もし誰かに盗聴されてもその内容を知られることはありません。

しかし、このままではメッセージを受け取ったボブすらもこのメッセージの内容を理解することができません。
f:id:ingentity:20190920182928j:plain

暗号鍵

暗号文を解読するのに必要になるのは、次のような暗号鍵と呼ばれる文字列です。

401B09EAB3C013D4CA54922BB802BEC8FD5318192B0A75F201D8B3727429080FB337591ABD3E44453B954555B7A0812E1081C39B740293F765EAE731F5A65ED1

暗号鍵はまさに鍵のような役割を持っており、暗号化する時と暗号解読(復号化)する時に使われます。

暗号化する際に暗号鍵を用意し、暗号文を生成します。
f:id:ingentity:20190920192142p:plain

ある暗号文を解読したい場合は、暗号化に使われた時と同じ暗号鍵を使うことで解読が可能です。
f:id:ingentity:20190920192318p:plain

鍵配送問題

再びアリスがボブにメッセージを送る話に戻りましょう。

アリスはメッセージが盗聴されないように、メッセージを暗号化しました。
この時アリスが用意した暗号鍵をここでは”abcd123”とします。(本来の暗号鍵はもっと長く複雑な文字列でなければなりません)

アリスは暗号化したメッセージをボブに送信しました。
しかしその後、ボブから連絡がきました。

「メッセージが読めないので、暗号鍵を送ってください」

このような場合、どう対応すればいいのでしょう。

もしアリスが暗号鍵”abcd123”をボブに送信してしまうと、盗聴されて暗号鍵を盗まれてしまう危険性があります。
暗号鍵を使えば誰でも暗号文を解読できるので、先ほど送信したアリスのメッセージが盗み見られてしまうことになります。

では暗号鍵を暗号化して送信する場合を考えましょう。
暗号鍵"abcd123"を新たな暗号鍵"efgh456"で暗号化してボブに送信します。

すると、またボブからメッセージがきました。
「暗号鍵が暗号化されていて読めないので、暗号鍵の暗号鍵を送ってください」

このように、暗号鍵を暗号化したとしても、その暗号鍵の暗号鍵を送る必要があり結局堂々巡りになってしまうのです。

f:id:ingentity:20190920194553j:plain

公開鍵暗号

暗号鍵の配送問題を解決することができる公開鍵暗号という技術が存在します。

公開鍵暗号とは簡単に言うと、暗号化するための鍵と暗号解読するための鍵を分ける技術です。
f:id:ingentity:20190920202150j:plain
暗号化するための鍵を公開鍵、解読するための鍵を秘密鍵といいます。
公開鍵暗号を理解するために次の3つを覚えておいてください。

  • 公開鍵では暗号化することはできますが、暗号を解読することはできません。
  • 秘密鍵では暗号解読はできますが、暗号文を作ることはできません。
  • 2つの鍵はペアになっているので、別々に作ることはできず、同時に生成されます。

再びアリスとボブの話に戻りましょう。

アリスはボブにメッセージを送ります。このメッセージは暗号化しません。

「いまからメッセージを送るので、公開鍵をください」

ボブはメッセージを受け取り、公開鍵と秘密鍵のペアを生成し、公開鍵のみをアリスに送ります。このメッセージも暗号化されていません。

「公開鍵は"efgh456"です」

アリスは本当に送りたかったメッセージをボブの公開鍵で暗号化します。

「91Mk8XDdkGm4ze2mih7yW16+REDBoS7FCqHVnQACvUGc45AfqGuUYeoRWFs+4i4Tc083rvN1HAVhj9OglxPCVRuLMQ4M6hWgK3oDEnFqR2qYazfF3R9kwA0B53xGoez0」

ボブはアリスから暗号文を受け取って、自分の持っている秘密鍵で暗号を解読します。

「ハロー、私アリス。電話番号は090xxxxxxだよ。プリーズコールミー」

これでアリスは盗聴されることなくメッセージをボブに送ることに成功しました。
途中ボブが、暗号化せずに公開鍵をアリスに送っていましたが、公開鍵をもし盗まれたとしても、その鍵では暗号文を解読することはできないので、アリスのメッセージを読むことはできません。

これが公開鍵暗号であり、この仕組みのおかげで私たちはインターネットを使って友達にメッセージを安全に送ることができるのです。

👏👏👏

以上、公開鍵暗号の仕組みでした。
読んでくれてありがとー