📑 本页目录(点开跳转)
15 · DH 与 ElGamal
⏱ 22 分钟 | ⭐⭐ 那个"不用见面也能共享秘密"的魔术
🎯 一句话
两个从没见过面的人,在一条被完全监听的信道上聊几句, 就能得到一个只有他们俩知道的共享密钥。 窃听者听到了全部对话,却什么也算不出来 —— 这在 1976 年之前被认为是不可能的。
🎨 一、先用颜色理解(不需要数学)
① 双方公开约定一个【公共颜色】:黄色 🟡
② Alice 私下选 红色 🔴,混合成 🟠 → 公开发送
③ Bob 私下选 蓝色 🔵,混合成 🟢 → 公开发送
④ Alice 收到 🟢,加入自己的 🔴 → 🟤
⑤ Bob 收到 🟠,加入自己的 🔵 → 🟤 ⭐ 同一个颜色!
窃听者看到了:🟡、🟠、🟢
他能配出 🟤 吗?
→ 需要从 🟠 里【分离出】红色 —— 混合容易,分离极难 ⭐
这个"混合容易、分离难"就是单向函数,数学上用的是模幂。
🤝 二、Diffie–Hellman 协议
公共参数:大素数 p,生成元 g ← 公开
Alice Bob
选私钥 a 选私钥 b
A = g^a mod p ──────A─────►
◄─────B────── B = g^b mod p
共享密钥 = B^a = (g^b)^a = g^ab 共享密钥 = A^b = (g^a)^b = g^ab
⭐ 两边相同
窃听者知道:p, g, g^a, g^b
他要算 g^ab → 这就是【CDH 问题】(第 13 章),公认困难
⚠️ 共享的结果不能直接当密钥用: $g^{ab}$ 是群里的一个元素,它的比特分布不均匀。 必须过一次 KDF:
key = HKDF(g^ab, salt, info)⭐
💀 三、DH 的致命缺陷:没有认证
💥 中间人攻击(MITM):
Alice ──g^a──► Mallory ──g^m──► Bob
Alice ◄─g^m── Mallory ◄──g^b── Bob
→ Alice 和 Mallory 建立了密钥 g^am
→ Bob 和 Mallory 建立了密钥 g^mb
→ Mallory 居中转发,【双方都以为在和对方通话】💀
🔑 这是本章最重要的一条: DH 提供机密性,但完全不提供认证。 裸的 DH 在真实网络上毫无意义。
怎么修:
| 方法 | 做法 | 用在哪 |
|---|---|---|
| 签名认证的 DH ⭐ | 双方对自己的 DH 公钥签名 | TLS 1.3 |
| 预共享密钥 | 用 PSK 派生或验证 | IoT、WireGuard |
| 口令认证(PAKE) | 用双方都知道的口令,且不泄露口令 | Wi-Fi WPA3(SAE)⭐ |
| 指纹校验 | 人工比对短指纹 | Signal 的"安全码" |
🔄 四、前向保密:DH 最重要的贡献
⭐ 用【临时的】DH 密钥对(每次会话新生成,用完就删)
→ 这叫 ephemeral DH(DHE / ECDHE)
💡 效果:
即使攻击者【今天录下了全部流量】,
又在【一年后偷到了服务器的长期私钥】,
他也【解不开去年的流量】⭐⭐
因为解密需要那次会话的临时私钥,而它早就被删除了
对比:
| 密钥交换方式 | 服务器私钥泄露后 |
|---|---|
| RSA 密钥传输(老式 TLS) | 💀 所有历史流量全部可解密 |
| ECDHE(现代 TLS) | ✅ 历史流量安全(前向保密) |
🔑 这就是 TLS 1.3 直接删掉 RSA 密钥传输的原因 —— 不是 RSA 不安全,是它没有前向保密。
💥 真实场景:"先收集,等以后再解密"(Harvest Now, Decrypt Later)—— 情报机构大规模录存加密流量,等待未来拿到密钥或量子计算机。 前向保密让这条路径失效。
📧 五、ElGamal 加密:DH 的"离线版"
DH 需要双方【在线交互】
ElGamal 让你可以给一个【离线的人】发加密消息
公钥:y = g^x mod p 私钥:x
加密 M:
选随机 r ⭐ 每次都要新的随机数
c₁ = g^r
c₂ = M · y^r = M · g^xr
密文 = (c₁, c₂)
解密:
M = c₂ / (c₁^x) = M·g^xr / g^rx ✅
💡 人话:发送方临时做了一次单方面的 DH,用得到的共享值把消息盖住。
| 性质 | ElGamal |
|---|---|
| 随机化 | ✅ 每次加密都不同 → 满足 IND-CPA |
| 安全假设 | DDH(第 13 章) |
| 密文膨胀 | ⚠️ 密文是明文的 2 倍长 |
| 同态性 | 乘法同态(可用于电子投票)⭐ |
⚠️ 两个致命的实现细节: ① r 绝不能重复 —— 重复则 c₂/c₂' = M/M',泄露明文比值 ② 必须在素数阶子群上做 —— 否则 DDH 不成立(第 13 章)
🔀 六、现代实践:混合加密
⚠️ 公钥运算【慢】,而且只能加密很短的消息
✅ 所以现实中总是【混合加密】:
① 用公钥方法协商/传输一个【对称密钥】(几十字节)
② 用对称加密(AES-GCM)加密【实际数据】(可以是 GB 级)
→ 公钥密码负责"解决密钥分发",对称密码负责"干活" ⭐
现代的标准形态叫 KEM(密钥封装机制):
Encaps(pk) → (密文 c, 共享密钥 K)
Decaps(sk, c) → K
⭐ 比"用公钥加密一个随机数"更容易做对,
也是后量子标准(ML-KEM)采用的形式(第 23 章)
🔗 和站内其他章的关系
| 相关的地方 | 和这一章的关系 |
|---|---|
| 第 13 章 CDH / DDH | DH 和 ElGamal 的安全依据 |
| 第 13 章 生成元 | DH 的公共参数 |
| 第 8 章 随机化才能 IND-CPA | ElGamal 的 r |
| 第 5 章 nonce 不能重复 | ElGamal 的 r 同理 ⭐ |
| 第 17 章 签名 | 修补 DH 的认证缺失 |
| 第 16 章 椭圆曲线 | ECDH:同样的协议,更小的密钥 |
| 第 23 章 后量子 | Shor 算法直接摧毁 DH |
| 模型上线之后 · 版本回溯与可复现 | ⚠️ 前向保密和可回溯是直接对立的:那边为了复现要尽量多留、留久,这边要求会话密钥用完即删——上线前必须先裁决哪个优先 ⭐ |
| 智能体教程 · 沙箱与提示注入 | 「事故二:借道白名单域名」是 DH 缺认证的现代翻版:通道加密了,不等于对面是谁被验证过 |
✅ 检查点
- 用颜色类比解释 DH 的原理。
- DH 的四个步骤是什么?窃听者面对的是什么问题?
- 为什么共享的 g^ab 不能直接当密钥用?
- DH 的致命缺陷是什么?描述中间人攻击。
- 修补 DH 认证缺失的四种方法?
- 什么是前向保密?举例说明它防的是什么场景。
- 为什么 TLS 1.3 删掉了 RSA 密钥传输?
- ElGamal 相比 DH 解决了什么问题?它的两个实现坑是什么?
- 什么是混合加密?为什么必须这样做?
👀 答案
- 双方公开约定黄色,各自私下选一个颜色混进去后公开发送,收到对方的混合色后再加入自己的私有色——两边得到同一个颜色。窃听者要配出它必须从混合色里分离出对方的私有色,而混合容易分离极难。
- 公开 p、g;Alice 发 A=g^a,Bob 发 B=g^b;各自算 B^a = A^b = g^ab。窃听者知道 p,g,g^a,g^b 要算 g^ab——这就是 CDH 问题。
- 因为 g^ab 是群里的元素,比特分布不均匀。必须过 KDF:
key = HKDF(g^ab, salt, info)。 - 完全不提供认证。中间人 Mallory 分别和 Alice、Bob 各做一次 DH,居中转发,双方都以为在和对方通话。裸 DH 在真实网络上毫无意义。
- ①签名认证的 DH(TLS 1.3)②预共享密钥(WireGuard)③口令认证 PAKE(WPA3 的 SAE)④人工指纹校验(Signal 安全码)。
- 用临时的、用完即删的 DH 密钥对(ECDHE)。效果:攻击者今天录下全部流量、一年后偷到服务器长期私钥,仍解不开去年的流量。防的是"先收集,等以后再解密"——情报机构录存流量等待未来拿到密钥或量子计算机。
- 因为 RSA 密钥传输没有前向保密——服务器私钥一旦泄露,所有历史流量全部可解密。不是 RSA 不安全,是它缺这个性质。
- DH 需要双方在线交互,ElGamal 让你能给离线的人发加密消息。两个坑:①r 绝不能重复(否则 c₂/c₂' = M/M' 泄露明文比值)②必须在素数阶子群上做,否则 DDH 不成立。
- 用公钥方法协商一个对称密钥,再用对称加密(AES-GCM)加密实际数据。因为公钥运算慢且只能加密很短的消息——公钥负责解决密钥分发,对称负责干活。现代标准形态是 KEM。
🛑 可以停在这里
⚡ 走神救援
⭐⭐DH:两个没见过面的人在被完全监听的信道上聊几句就能得到共享密钥(1976 年之前认为不可能)。颜色类比:公共黄色 + 各自私有色混合后交换,再加入自己的私有色 → 同一个颜色;窃听者要从混合色分离出私有色,混合容易分离难。数学:公开 p,g,Alice 发 g^a、Bob 发 g^b,各自算 g^ab;窃听者面对 CDH 问题。⚠️g^ab 不能直接当密钥(比特分布不均匀)必须过 HKDF。💀⭐致命缺陷:DH 不提供认证 → 中间人攻击(Mallory 分别和两边各做一次 DH 居中转发,双方都以为在和对方通话)→ 裸 DH 在真实网络上毫无意义。修补:⭐签名认证的 DH(TLS 1.3)、预共享密钥、PAKE(WPA3 的 SAE)、人工指纹校验(Signal 安全码)。⭐⭐前向保密:用临时的、用完即删的 DH 密钥对(ECDHE)→ 攻击者今天录下全部流量、一年后偷到服务器长期私钥,仍解不开去年的流量;⭐这就是 TLS 1.3 删掉 RSA 密钥传输的原因(RSA 密钥传输下私钥泄露 = 所有历史流量可解);防的是💥"先收集、等以后再解密"。ElGamal = DH 的离线版:公钥 y=g^x,加密选随机 r 得 (g^r, M·y^r),解密 M = c₂/c₁^x;随机化 ⟹ IND-CPA,靠 DDH,⚠️密文是明文 2 倍长,有乘法同态(可做电子投票);两个坑:r 绝不能重复(否则泄露 M/M')、必须在素数阶子群上做。现代总是混合加密:公钥协商对称密钥、对称加密干活(公钥慢且只能加密很短消息);标准形态是 KEM(Encaps/Decaps),也是后量子 ML-KEM 采用的形式。
下一节 👉 16-椭圆曲线.md