安全な通信を考える(ハッシュ関数/電子署名)

「安全な通信を考える(共通鍵暗号/公開鍵暗号)」の続きです。公開鍵方式では相手(送信者)の検証ができませんでした。「なりすまし」をされたらわかりません。

でもちゃんと送信者を検証できる仕組みがあります。それにはまず「ハッシュ関数」を知る必要があります。

■ハッシュ関数

関数というと理系でない人は引いてしまいそうですが、そんなに難しくはありません(僕も特徴しか押さえていません)。ハッシュ関数は以下の特徴があります。

  • 任意の長さのデータから、固定長のデータ(ビット列)を生成する。※この固定長のデータのことをバッシュ値、もしくは、メッセージダイジェストと呼びます。
  • 生成されたハッシュ値からもとのデータの復元はできない(もとに戻せない)。
  • もとのデータがわずか1ビットでも異なれば、生成されるハッシュ値も異なる。
  • 同じハッシュ値をもつ異なるデータを作成することは、ほぼ不可能。

ハッシュ関数にはMD5や、SHA-1、SHA-2といったものがあります。

話をもとに戻します。このハッシュ関数と公開鍵暗号を組み合わせることで「なりすまし」を防ぐことができるようになります。

前回は、こうでした。

  1. Aさんが自分の公開鍵をBさんに渡し、BさんがAさんの公開鍵で暗号化してAさんに送る。

これを、変えます。

  1. まず、Bさんには自分の秘密鍵/公開鍵のペアを作成してもらい、AさんがBさんの公開鍵を受け取る。
  2. Bさんには、Bさんの秘密鍵で暗号化をしてもらいそれをAさんに送ってもらう。
  3. Aさんは、Bさんから送られた情報をBさんの公開鍵で復号する。

絵にすると以下の図1です。

図1

ん?
図1の上のほうは相手がBさんかわからないけれども、Aさんの公開鍵で暗号化しているため通信内容は秘匿化されていました。でも下のほうはBさんの秘密鍵で暗号化してるのでBさんの公開鍵をもっている人(いっぱいいるだろ?)なら誰でも復号できてしまうけど、いいの?

図1の下の場合、通信内容は誰にでも知られてしまうのですが、ここにはBさんでしかできないことが隠されています。

AさんはBさんから送られた来た情報をBさんの公開鍵で復号しますが「復号できたということは、相手は秘密鍵を持っているBさんしかありえない」ということです。公開鍵はいろんな人がもっていて構いませんが、秘密鍵を持っているのは鍵を生成したBさんだけだからです

■電子署名

この仕組みを利用したものが電子署名(デジタル署名)です。電子署名は以下のようなやりとりになります。Aさんが情報の受信者、Bさんが送信者となります。

【Bさんの作業】

  1. 送りたい情報(本文)を作成する。
  2. 本文をハッシュ関数でハッシュ値にする(ダイジェストの作成)。
  3. 作成したダイジェストを秘密鍵で暗号化する。※この暗号化されたダイジェストが電子署名と呼ばれるものです。
  4. Aさんに本文と電子署名を送信する。

【Aさんの作業】

  1. Bさんから本文と電子署名を受け取る。
  2. 受け取った本文をハッシュ関数でハッシュ値にする(ダイジェストの作成)。
  3. 受け取った電子署名をBさんの公開鍵で復号する。※復号すると、Bさんが作成したダイジェストになる。
  4. 2と3のダイジェストを比較する。

【Aさんの作業】の「4」において、ダイジェストが一致すれば送信者はBさんに間違いないことになります。また、本文が改ざんされていない証拠にもなります。電子署名の持つ機能として、送信者の検証と改ざんの検知ができるのです。

これを絵にしたものが図2になります。

図2

ここで注意したのは、本文はあくまでも電子署名を検証するために必要なもので隠したい情報ではないということです。安全に通信したい内容は送信者がBさんだと検証できた上で、Aさんの公開鍵を渡してはじめることになります。

電子署名を使うことで相手がBさんであることの確認も取れ、安全な通信ができるようになりました・・ん?

そもそも、、Bさんを装った誰かが自分の秘密鍵/公開鍵を作成し、自分をBさんと語って自分の公開鍵をAさんに渡していたら・・。話がもとに戻ったような気がしてしまうのだけれど、今までの話は大事な前提があったのです。

【前提】
Bさん(つまりは通信相手)の「本物の公開鍵」が自分の手元にあること。

これが成り立たないと、電子署名だけではまったく意味がありません。
この問題については、「安全な通信を考える(電子証明書/PKI)」に続く

安全な通信を考える(共通鍵暗号/公開鍵暗号)

IPAが実施する情報処理資格の情報処理安全確保支援士やネットワークスペシャリスト試験。僕も受験しました。試験勉強しているなかで電子証明書とかPKIなど暗記してしまえばいいのかもしれないけれど、そもそも「なぜそんなことが必要なのか?」を理解するほうが頭に入ってきますので(僕の感覚でだけれど)、その考え方をまとめてみようと思います。実は、勉強していたときは「なるほど」と思い納得していたのだけれど時間が立つに連れ忘れてしまい、どこかでまとめておきたかったのでこのブログを機にまとめることにしました。3回にわけてまとめます。物語風です。

1回目:安全な通信を考える(共通鍵暗号/公開鍵暗号)
2回目:安全な通信を考える(ハッシュ関数/電子署名)
3回目:安全な通信を考える(電子証明書/PKI)

今回は、その1回目です。

■共通鍵暗号

安全な通信を行いたい場合、他の人が読めないように暗号化を行えば安心です。その暗号化の方式としてまず考え出されたのが「共通鍵暗号方式」です。これは共通鍵という鍵を使い暗号化と復号を行うものです。この共通鍵はAさん(送信者)とBさん(受信者)の双方が同じものを持っている必要があります。通信手順は以下となります。

  1. Aさんが共通鍵で送りたい情報を暗号化します。
  2. AさんがBさんにネットワークを介して、情報を送ります。
  3. Bさんが共通鍵で届いた情報を復号します。

共通鍵方式ではAさんもBさんも同じ鍵を使い暗号化と復号を行います。ポイントは「共通鍵はAさんとBさん以外に知られてはいけない」です。もし共通鍵が他者に漏れてしまった場合、盗聴されて暗号が解読されてしまうからです。

ただこの方式には根本的な問題があります(図1)。

図1

共通鍵をBさんに安全に渡す方法があるのであれば、共通鍵方式を使わずに、その方法でBさんに送りたい情報を送れば良いのだから。

■公開鍵暗号

そこで、共通鍵暗号方式とは別の方式が考え出されました。それが「公開鍵暗号方式」です。公開鍵方式では1対の鍵のペア(秘密鍵と公開鍵と呼ぶ)を生成し、AさんとBさんが別々の鍵を持ちます。通常は鍵のペアを生成したほうが秘密鍵を持ち、相手に公開鍵を渡します。Aさんが鍵を生成した場合はAさんが秘密鍵を持ち、Bさんに公開鍵を渡します。

この方式のポイントは、3つあります。

  • 秘密鍵は絶対に漏らしてはいけないが、公開鍵は他の人に渡ってもよい(むしろ公開する)。
  • 公開鍵で暗号化したものは秘密鍵で復号できる、秘密鍵で暗号化したものは公開鍵で復号できる。
  • 公開鍵を受け取ったほうから暗号文を送る。

共通鍵方式では共通鍵を渡す方法が問題でした。公開鍵方式では公開鍵を相手に渡してから(渡すときに他者に知られてもよい)通信を行います。鍵を生成し秘密鍵を持っているAさんが受信者、公開鍵を受け取ったBさんが送信者になり、通信手順は以下となります。

  1. Bさんが公開鍵で送りたい情報を暗号化します。
  2. BさんがAさんにネットワークを介して、情報を送ります。
  3. Aさんが秘密鍵で届いた情報を復号します。

公開鍵はBさん以外にも知られることになりますが、公開鍵から秘密鍵を生成することはできないので暗号化された内容を復号できるのは秘密鍵をもつAさんだけです。これで安全な通信ができるようになりました。

いや、、果たしてそうでしょうか(図2)?

図2

Aさんは公開鍵を公開してしまったのでBさんでない誰かがBさんを装い、Aさんに暗号文を送ってきたかもしれません。これでは安全な通信とは言えません。どうしたら良いでしょうか・・。

「安全な通信を考える(ハッシュ関数/電子署名)」に続く