はじめに
この記事は、ITについて全く知らない人に、インターネットでの暗号化の仕組み(特にHTTPS)についてわかりやすく説明することを目的としています。そのため、具体的な暗号化手法やプロトコルについては、あえて触れていません。技術的、専門的な知識を求めている方は、別の記事をご参照ください。
説明に使用するもの
この記事では、登場人物としてAさん、Bさん、Cさんを用意します。*1
AさんとCさんでメッセージをやりとりしたいのですが、メッセージは毎回Bさん経由でなければいけない、という設定です。
では、順を追って説明していきます。
1.メッセージを暗号化する
Aさんは次のような仕組みを考えCさんと共有します。
- メッセージをすべてN文字ずつずらして書き直す
- 例えばN=1の時、「こんにちは」→「さあぬつひ」*2
Aさんはこの仕組みで暗号化した手紙をCさん宛てに送りたいです。
ですが、この方法だとNという値をBさんに知られずにCさんに共有することができなければ意味がありません。
直接会って教えれば可能ですが、ここではそれは無理だと仮定します。
2.暗号化用の鍵、復号用の鍵を作成
手紙のやり取りだけで、Bさんにバレることなく鍵を共有したいと考えたAさんは新たにこんなものを発明します。
- 暗号化だけできる鍵 → 公開鍵とよぶ
- 復号だけできる鍵 → 秘密鍵とよぶ*3
また、さっきまで使用していた鍵Nを共通鍵とよぶことにします。
Aさんは、公開鍵と秘密鍵を作り、公開鍵だけをCさんに渡します。
Cさんは、共通鍵を作り、それをAさんから受け取った公開鍵で暗号化してAさんに返します。
Aさんは、自分だけが持っている秘密鍵でCさんからのメッセージを復号し、共通鍵を手にいれます。
この時点でそれぞれが持っている(知っている)鍵はこうなります
・Aさん → 公開鍵、秘密鍵、共通鍵
・Bさん → 公開鍵
・Cさん → 公開鍵、共通鍵
Bさんに知られることなく、共通鍵を共有することができていますね!
その後、AさんとCさんは共有した共通鍵を使って安全にメッセージを通信することができました。めでたしめでたし。*4
注釈
*1 Aさんがサーバー、Cさんがブラウザ、Bさんが不特定多数の人々と想定しています。
*2 シーザー暗号と呼ばれる方法で、原始的な暗号化方法です。実際はAESという複雑な方法で暗号化が行われています。
*3 実際にはRSA暗号というアルゴリズムで作成され、二つの素数が秘密鍵、その積が公開鍵となります。
*4 本記事の暗号化に加え、公開鍵が本当に正しい相手のものであることを確認するために、公開鍵認証という仕組みも存在します。