鍵共有プロトコル:Diffie-Hellman と楕円曲線 DH の動作原理
盗聴される回線でも二者が同じ秘密鍵を作れる仕組みが DH。離散対数の困難さ・中間者対策・前方秘匿性の原理を踏み込んで解説します。
- 1.DH は公開チャネルだけで二者が同じ共有鍵に到達する仕組み。安全性は「公開値から指数(秘密値)を逆算できない」離散対数問題の困難さに依存します。
- 2.DH 単体は中間者攻撃に無力。回線上で誰と鍵を共有したかを保証しないため、署名や証明書による相手認証(PKI)が必ず必要です。
- 3.やり取りごとに使い捨てる「エフェメラル鍵(ECDHE)」を使うと、長期秘密鍵が後で漏れても過去の通信は復号できない=前方秘匿性(PFS)が得られます。
解きたい問題:盗聴されている回線で鍵を作る
公開鍵暗号 は鍵配送問題を解きますが、別の道もあります。そもそも鍵を「送らない」のです。回線上を流れる値はすべて盗聴者に見えている――その前提で、二者が同じ秘密の鍵にたどり着けるか。これを実現するのが Diffie-Hellman(DH)鍵共有です。
DH は鍵を暗号化して運ぶのではなく、双方が自分だけの秘密値を持ち寄り、公開のやり取りを経て同じ値を計算で導出する。盗聴者は流れる公開値をすべて見ても、最終的な共有鍵を再現できません。その非対称性を生むのが、一方向には簡単・逆方向には極めて困難な数学的構造です。
DH の数理:べき乗は簡単、逆算は困難
古典的な DH は、有限体上のべき乗を使います。あらかじめ公開のパラメータとして、大きな素数 p と生成元 g を共有しておきます。手順は次のとおりです。
公開パラメータ: 素数 p, 生成元 g ← 誰でも知ってよい
Alice: 秘密 a を選ぶ → 公開値 A = g^a mod p を送る
Bob : 秘密 b を選ぶ → 公開値 B = g^b mod p を送る
Alice が計算: s = B^a mod p = (g^b)^a = g^(ab) mod p
Bob が計算: s = A^b mod p = (g^a)^b = g^(ab) mod p
→ 双方が同じ共有秘密 g^(ab) mod p に到達する
鍵となるのは指数法則 (g^b)^a = (g^a)^b = g^(ab) です。Alice は自分の a と受け取った B から、Bob は自分の b と受け取った A から、同じ g^(ab) mod p を別々に計算できる。一方で回線を流れるのは g・p・A・B だけです。
盗聴者は A = g^a mod p を見ていますが、ここから a を求めるには「g を何乗したら A になるか」を解く必要があります。これが離散対数問題(DLP)で、p が十分大きければ現実的な時間で解けません。べき乗の計算は速いのに、その逆(指数の復元)は困難――この一方向性が DH の安全性の土台です。
導出した g^(ab) は数学的な生の値で、ビットの偏りなどクセを持ちます。実際にはこれを **KDF(鍵導出関数、例 HKDF)**に通し、暗号用途ごとに均一でランダムな鍵を取り出します。生の DH 出力を直接 AES 鍵にするのは誤りです。
ECDH:同じ原理を楕円曲線で
楕円曲線 Diffie-Hellman(ECDH)は、DH の「べき乗」を楕円曲線上の点のスカラー倍算に置き換えたものです。構造は完全に同じで、難しい問題が**楕円曲線版の離散対数問題(ECDLP)**に替わります。
公開パラメータ: 曲線と基準点 G
Alice: 秘密 a → 公開点 A = a * G を送る
Bob : 秘密 b → 公開点 B = b * G を送る
Alice: a * B = a*(b*G) = (ab) * G
Bob : b * A = b*(a*G) = (ab) * G
→ 双方が同じ点 (ab)*G に到達。そのx座標などを KDF に通して鍵にする
ECDH の利点は鍵長あたりの強度の高さです。ECDLP は古典 DLP より逆算が難しく、より短い鍵で同等の安全性が得られます。目安として、曲線 Curve25519 を使う X25519 の 256 ビット鍵は、有限体 DH の 3072 ビット相当の強度を持ちます。鍵・計算量が小さく済むため、現代の TLS ではこの X25519 などの ECDH が主流です。
| 観点 | 有限体 DH(FFDHE) | 楕円曲線 DH(ECDH) |
|---|---|---|
| 難しい問題 | 離散対数問題(DLP) | 楕円曲線離散対数問題(ECDLP) |
| 公開値 | g^a mod p(大きな整数) | a*G(曲線上の点) |
| 同等強度の鍵長 | 3072 ビット級 | 256 ビット級(X25519 など) |
| 計算コスト | 重い | 軽い(鍵・帯域が小さい) |
| 現在の主流度 | 減少傾向 | 事実上の標準 |
致命的な穴:中間者攻撃と認証の必要性
ここで強調すべき点があります。DH 単体は「誰と」鍵を共有したのかを一切保証しません。流れる公開値(A、B)には署名も身元もなく、回線上の値を差し替える攻撃者を防げないのです。
Alice ──A──▶ [攻撃者 M] ──A'──▶ Bob
Alice ◀─B'── [攻撃者 M] ◀──B─── Bob
M は Alice とは鍵 K1 を、Bob とは鍵 K2 を別々に DH 確立し、
両者になりすまして通信を中継・復号・再暗号化する。
Alice も Bob も「相手と直接共有できた」と誤認する。
これが**中間者攻撃(MITM)**です。攻撃者 M は Alice の公開値を捨て、自分の値を Bob へ送り、逆も同様に行います。結果、Alice ⇔ M、M ⇔ Bob でそれぞれ別の鍵が確立され、M は全通信を盗み見できます。DH の数理がいくら堅牢でも、公開値が本物の相手のものかを確かめなければ無意味です。
DH が解くのは「鍵をどう作るか」だけで、「相手が誰か」は解きません。実運用では DH の公開値を長期秘密鍵で署名する(TLS なら サーバー証明書 と署名で)か、事前共有鍵で認証します。認証なしの生 DH は MITM に対して丸腰だと必ず押さえてください。
この「公開値が本人のものである」保証を与えるのが、公開鍵基盤(PKI) と 電子署名 です。TLS ハンドシェイクでは、サーバーが ECDH の公開値を自分の秘密鍵で署名し、クライアントは証明書チェーンで検証します。これにより「鍵共有の相手=証明書の持ち主」が結びつき、MITM が排除されます。
エフェメラル鍵と前方秘匿性(PFS)
DH の秘密値 a、b の扱い方で、安全性の性質が大きく変わります。これらを接続のたびに使い捨てる方式をエフェメラル(ephemeral)DH と呼び、ECDH 版を ECDHE、有限体版を DHE と書きます。
なぜ使い捨てるのか。仮に長期間同じ DH 秘密値を使い回すと、その値が将来漏れた時点で、それを使った過去すべての通信が一括で復号されてしまいます。盗聴者が暗号文を保存しておき、後から鍵を入手して遡って解読する――という「記録しておいて後から復号」の攻撃が成立してしまうのです。
過去の通信の安全性が、将来の鍵漏洩に左右されない性質を前方秘匿性と呼びます。ECDHE では接続ごとに新しい a、b を生成し、セッション鍵を導出した直後に捨てます。長期秘密鍵(証明書の秘密鍵)が後で漏れても、過去のセッション鍵はもう存在せず再計算もできないため、保存された暗号文は復号できません。
ここで重要なのは、長期秘密鍵の役割が「認証」だけに限定される点です。RSA 鍵交換の旧来 TLS では、サーバーの長期秘密鍵が鍵共有そのものに使われていたため、その鍵が漏れれば過去のセッションすべてが復号可能でした。ECDHE では、長期秘密鍵は**ECDH 公開値への署名(相手認証)**にのみ使い、実際のセッション鍵はその場限りのエフェメラル値から導出します。
RSA 鍵交換(PFS なし):
クライアントが生成した鍵を、サーバー公開鍵で暗号化して送る
→ サーバー長期秘密鍵が漏れると、保存された過去の暗号文を全復号できる
ECDHE(PFS あり):
双方がその場限りのエフェメラル鍵で ECDH → セッション鍵を導出 → 破棄
長期秘密鍵は「公開値の署名(認証)」だけに使う
→ 長期秘密鍵が漏れても、捨てたエフェメラル鍵は復元できず過去は守られる
この理由から、TLS 1.3 では鍵交換が ECDHE(および DHE)に一本化され、PFS のない RSA 鍵交換は廃止されました。現代の安全な通信では、エフェメラル鍵共有は選択肢ではなく前提です。
まとめ
Diffie-Hellman は、盗聴されている公開チャネルだけで二者が同じ共有鍵に到達する仕組みで、安全性は公開値から秘密の指数を逆算できない離散対数問題の困難さに依存します。ECDH はこれを楕円曲線へ移し、短い鍵で高い強度を実現した現代の標準です。
ただし DH の数理は「鍵をどう作るか」しか解かず、「相手が誰か」は保証しないため、署名や証明書(PKI)による相手認証が不可欠です。さらに、接続ごとに鍵を捨てる**エフェメラル DH(ECDHE)を使えば、長期秘密鍵が将来漏れても過去の通信を守れる前方秘匿性(PFS)**が得られます。鍵共有・相手認証・前方秘匿性は別々の問題であり、安全な通信はこの三つを揃えて初めて成立します。土台となる鍵と署名の考え方は 暗号の基礎、なりすまし防止の全体像は 認証と認可 と併せて押さえると理解が深まります。
セキュリティ Article
鍵共有プロトコル:Diffie-Hellman と楕円曲線 DH の動作原理を実務で読む
TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。
解決すること
鍵交換
比較で見る軸
難易度: advanced / カテゴリ: セキュリティ / タグ数: 5
導入後に効く点
DH 単体は中間者攻撃に無力。回線上で誰と鍵を共有したかを保証しないため、署名や証明書による相手認証(PKI)が必ず必要です。
先に潰すリスク
用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。
- 難易度
- advanced
- カテゴリ
- セキュリティ
- タグ数
- 5
判断チェックリスト
- 自社の用途が「鍵交換 / Diffie-Hellman」に近いか確認する。
- 強みである「DH は公開チャネルだけで二者が同じ共有鍵に到達する仕組み。安全性は「公開値から指数(秘密値)を逆算できない」離散対数問題の困難さに依存します。」が本当に評価軸になるか確認する。
- 注意点の「用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。」を運用で吸収できるか確認する。
- 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
- 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
- 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。