Diffie-Hellman 鍵交換を使う
Diffie-Hellman は、安全でないチャネル上で秘密自体を送信せずに、2 者が共有秘密を確立できるようにします。TLS 鍵交換の基盤です。
- 1
Diffie-Hellman は巡回群で動作します。両者は生成元 g と素数 p に合意します。各々が秘密のランダム指数(a、b)を選び、g^a と g^b を公開で送り、(g^b)^a = (g^a)^b = g^(ab) を共有シークレットとして計算します。盗聴者は g、p、g^a、g^b を見られますが、離散対数問題を解かずに g^(ab) を計算できません。
- 2 素数ジェネレーター →
安全な素数 p(p = 2q + 1、q も素数)を生成します。DH には 2048 ビット以上の素数を使ってください。素数は共有され公開されます。よく知られたグループ(RFC 7919)でも、新規に生成したものでもかまいません。
- 3 剰余べき乗計算ツール →
a をあなたの秘密のランダム指数として g^a mod p を計算します。結果を相手に送信します。相手の g^b mod p を受け取り、(g^b)^a mod p を計算して共有シークレットを得ます。
- 4
古典的な DH の代わりに ECDH(楕円曲線 Diffie-Hellman)を使ってください。より高速で、同等のセキュリティにより小さな鍵を使います。P-256(NIST)または Curve25519 が標準的な選択です。TLS では、前方秘匿のために常に一時鍵(DHE/ECDHE)を使ってください。
よくある質問
- 前方秘匿とは何ですか?
- 各セッションは、セッション後に破棄される新しい一時鍵ペアを使います。後に長期鍵が漏洩しても、一時鍵はもう存在しないため、過去のセッション鍵を復元できません。TLS 1.3 は前方秘匿を必須としています。
- DH と ECDH の違いは?
- ECDH は、素数を法とする乗法群の代わりに楕円曲線群を使います。はるかに小さな鍵で同じセキュリティを達成し(256 ビット曲線 ≈ 3072 ビット DH)、高速で効率的です。ECDH には Curve25519 または P-256 を使ってください。