合同会社小村ソフト
第 2 章

暗号の道具箱 — 共通鍵・公開鍵・ハッシュ・署名

共通鍵・公開鍵・ハッシュ・デジタル署名の 4 つの道具を「何を解決するか」で区別し、TLS がなぜハイブリッド方式なのかをつかむ。

4 つの道具を「何を解決するか」で並べる

第 1 章で、TLS は 3 つの保証(機密性・完全性・真正性)の組み合わせだと確認しました。この章では、それを実現する 4 つの道具を開けていきます。暗号の教科書は道具の「仕組み」から入りがちですが、この講座では一貫して「その道具がない世界では何に困るか」から入ります。

道具解決する困りごと答える保証
共通鍵暗号大量のデータを高速に暗号化したい機密性
公開鍵暗号会ったことのない相手と、どうやって鍵を共有するか機密性(の入口)
ハッシュ内容が変えられたことに気づきたい完全性
デジタル署名「本人が作った」ことを確かめたい真正性

共通鍵暗号 — 速いが、鍵をどう渡すか

共通鍵暗号(AES など)は、同じ鍵で暗号化と復号を行います。非常に高速で、大量の通信本文を守るのに向いています。TLS で実際にあなたのデータを暗号化しているのは、ほぼこの共通鍵暗号です。

弱点は 1 つ — その鍵を、相手にどうやって安全に渡すか。鍵をメールで送れば盗聴され、盗聴されない経路があるならそもそも暗号は要りません。これが鍵配送問題です。さらに、通信したいペアの数だけ鍵が必要なので、人数が増えると鍵の本数は 2 乗のペースで増えます。

公開鍵暗号 — 鍵を「開ける鍵」と「閉める鍵」に分ける

公開鍵暗号は、対になる 2 つの鍵 — 公開鍵秘密鍵 — を使います。公開鍵で暗号化したものは、対になる秘密鍵でしか復号できません。

公開鍵 = 南京錠
誰にでも配ってよい。誰でもこの錠で箱を閉められる
秘密鍵 = その錠を開ける唯一の鍵
本人だけが持つ。閉まった箱を開けられるのは本人だけ

これで鍵配送問題が変わります。各自が「南京錠」を公開しておくだけで、誰とでも秘密の通信を始められる — 事前に秘密を共有する必要がなくなりました。ただし公開鍵暗号は共通鍵暗号より桁違いに遅いため、本文を全部これで暗号化するのは現実的ではありません。

TLS の答え = ハイブリッド方式: 公開鍵の技術で「共通鍵」を安全に共有し(第 3 章の鍵合意)、本文は高速な共通鍵暗号で守る。遅い道具は最初の一瞬だけ、速い道具を本番に使う分業です。

公開鍵の技術で共通鍵を共有し、本文は共通鍵暗号で高速に守るハイブリッド方式の図

ハイブリッド方式の分業。第 5 章で見る TLS 1.3 ハンドシェイクは、この「最初の一瞬」を 1 往復で済ませる手順です。

小問 2-1 — 鍵配送問題を数える

共通鍵方式の限界と、公開鍵方式がそれをどう解くかを、手を動かして確認します。

Q1. 10 人のグループ全員が、他の 9 人それぞれと共通鍵方式で秘密に通信したいとします。ペアごとに別の鍵を使うとき、必要な鍵は全部で何本ですか。

Q2. 公開鍵暗号を使って、A さんにだけ読めるメッセージを送りたいとき、暗号化に使う鍵はどれですか。

ハッシュ — 内容の「指紋」を取る

ハッシュ関数(SHA-256 など)は、どんな長さの入力からも固定長の値(ハッシュ値)を作る一方向の関数です。次の 3 つの性質がそろって、はじめて「指紋」として使えます。

  • 同じ入力 → 必ず同じ出力。照合に使える
  • 1 ビットでも違う入力 → まったく違う出力。わずかな改ざんでも指紋が一致しなくなる
  • 出力から入力を逆算できない。指紋から本体は復元できない

ただし、ハッシュ値をデータと一緒に送るだけでは改ざん検知になりません。途中の攻撃者が本文を書き換え、ハッシュ値も計算し直して差し替えればよいからです。そこで実際の通信では、ハッシュにを混ぜ込みます。鍵を知る者にしか正しい値を作れない指紋 — これが MAC(メッセージ認証コード)で、TLS では暗号化と改ざん検知を一体で行う認証付き暗号(AEAD)という形で使われています(第 5 章で再登場します)。

デジタル署名 — 「本人が作った」ことの証明

公開鍵暗号の鍵ペアは、逆向きにも使えます。秘密鍵で署名を作り、公開鍵で検証する — 秘密鍵は本人しか持っていないので、検証に成功すれば「この内容は秘密鍵の持ち主が確かに承認したもので、その後変わっていない」と言えます。

暗号化(機密性)署名(真正性)
作る側が使う鍵相手の公開鍵自分の秘密鍵
受け取る側が使う鍵自分の秘密鍵相手の公開鍵
守るもの内容を読まれない作った本人と内容の無改変を確かめる

署名は、この講座の後半を支える道具です。第 4 章の証明書は「CA がドメインの持ち主の公開鍵に署名したもの」であり、第 5 章のハンドシェイクではサーバが「秘密鍵を本当に持っていること」を署名で証明します。

小問 2-2 — 道具を取り違えない

4 つの道具はそれぞれ別の問いに答えます。「どの道具が何を解決するか」を確認します。

Q3. TLS は通信本文の暗号化に、公開鍵暗号ではなく共通鍵暗号を使います。主な理由はどれですか。

Q4. 暗号学的ハッシュ関数の性質としてあてはまらないものはどれですか。

Q5. デジタル署名を検証するとき、検証する側が使う鍵はどれですか。

この章で持ち帰ること

  • 共通鍵暗号は速いが鍵配送問題を抱える。n 人の総当たりで鍵は n(n−1)/2 本
  • 公開鍵暗号は鍵配送問題を解くが遅い。TLS は両者のハイブリッドで分業する
  • ハッシュは一方向の指紋。鍵を混ぜた MAC / AEAD ではじめて改ざん検知になる
  • 署名は秘密鍵で作り公開鍵で検証。暗号化と鍵の向きが逆

次章では、「会ったことのない相手と共通鍵を作る」を実際に手計算します。公開鍵の技術が魔法ではないことを、自分の手で確かめてください。