「安全な通信を考える(共通鍵暗号/公開鍵暗号)」の続きです。公開鍵方式では相手(送信者)の検証ができませんでした。「なりすまし」をされたらわかりません。
でもちゃんと送信者を検証できる仕組みがあります。それにはまず「ハッシュ関数」を知る必要があります。
■ハッシュ関数
関数というと理系でない人は引いてしまいそうですが、そんなに難しくはありません(僕も特徴しか押さえていません)。ハッシュ関数は以下の特徴があります。
- 任意の長さのデータから、固定長のデータ(ビット列)を生成する。※この固定長のデータのことをバッシュ値、もしくは、メッセージダイジェストと呼びます。
- 生成されたハッシュ値からもとのデータの復元はできない(もとに戻せない)。
- もとのデータがわずか1ビットでも異なれば、生成されるハッシュ値も異なる。
- 同じハッシュ値をもつ異なるデータを作成することは、ほぼ不可能。
ハッシュ関数にはMD5や、SHA-1、SHA-2といったものがあります。
話をもとに戻します。このハッシュ関数と公開鍵暗号を組み合わせることで「なりすまし」を防ぐことができるようになります。
前回は、こうでした。
- Aさんが自分の公開鍵をBさんに渡し、BさんがAさんの公開鍵で暗号化してAさんに送る。
これを、変えます。
- まず、Bさんには自分の秘密鍵/公開鍵のペアを作成してもらい、AさんがBさんの公開鍵を受け取る。
- Bさんには、Bさんの秘密鍵で暗号化をしてもらいそれをAさんに送ってもらう。
- Aさんは、Bさんから送られた情報をBさんの公開鍵で復号する。
絵にすると以下の図1です。
図1
ん?
図1の上のほうは相手がBさんかわからないけれども、Aさんの公開鍵で暗号化しているため通信内容は秘匿化されていました。でも下のほうはBさんの秘密鍵で暗号化してるのでBさんの公開鍵をもっている人(いっぱいいるだろ?)なら誰でも復号できてしまうけど、いいの?
図1の下の場合、通信内容は誰にでも知られてしまうのですが、ここにはBさんでしかできないことが隠されています。
AさんはBさんから送られた来た情報をBさんの公開鍵で復号しますが「復号できたということは、相手は秘密鍵を持っているBさんしかありえない」ということです。公開鍵はいろんな人がもっていて構いませんが、秘密鍵を持っているのは鍵を生成したBさんだけだからです。
■電子署名
この仕組みを利用したものが電子署名(デジタル署名)です。電子署名は以下のようなやりとりになります。Aさんが情報の受信者、Bさんが送信者となります。
【Bさんの作業】
- 送りたい情報(本文)を作成する。
- 本文をハッシュ関数でハッシュ値にする(ダイジェストの作成)。
- 作成したダイジェストを秘密鍵で暗号化する。※この暗号化されたダイジェストが電子署名と呼ばれるものです。
- Aさんに本文と電子署名を送信する。
【Aさんの作業】
- Bさんから本文と電子署名を受け取る。
- 受け取った本文をハッシュ関数でハッシュ値にする(ダイジェストの作成)。
- 受け取った電子署名をBさんの公開鍵で復号する。※復号すると、Bさんが作成したダイジェストになる。
- 2と3のダイジェストを比較する。
【Aさんの作業】の「4」において、ダイジェストが一致すれば送信者はBさんに間違いないことになります。また、本文が改ざんされていない証拠にもなります。電子署名の持つ機能として、送信者の検証と改ざんの検知ができるのです。
これを絵にしたものが図2になります。
図2
ここで注意したのは、本文はあくまでも電子署名を検証するために必要なもので隠したい情報ではないということです。安全に通信したい内容は送信者がBさんだと検証できた上で、Aさんの公開鍵を渡してはじめることになります。
電子署名を使うことで相手がBさんであることの確認も取れ、安全な通信ができるようになりました・・ん?
そもそも、、Bさんを装った誰かが自分の秘密鍵/公開鍵を作成し、自分をBさんと語って自分の公開鍵をAさんに渡していたら・・。話がもとに戻ったような気がしてしまうのだけれど、今までの話は大事な前提があったのです。
【前提】
Bさん(つまりは通信相手)の「本物の公開鍵」が自分の手元にあること。
これが成り立たないと、電子署名だけではまったく意味がありません。
この問題については、「安全な通信を考える(電子証明書/PKI)」に続く。