📑 本页目录(点开跳转)
15 · DH 与 ElGamal
⏱ 22 分钟 | ⭐ 那个"不用见面也能共享秘密"的魔术
🎯 一句话
两个从没见过面的人,在一条被完全监听的信道上聊几句, 就能得到一个只有他们俩知道的共享密钥。 窃听者听到了全部对话,却什么也算不出来 —— 这在 1976 年之前被认为是不可能的。
🎨 一、先用颜色理解(不需要数学)
流程图
这个"混合容易、分离难"就是单向函数,数学上用的是模幂。
🤝 二、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
⭐ 两边相同
信息关系
⚠️ 共享的结果不能直接当密钥用: $g^{ab}$ 是群里的一个元素,它的比特分布不均匀。 必须过一次 KDF:
key = HKDF(g^ab, salt, info)⭐
💀 三、DH 的致命缺陷:没有认证
结果对照
🔑 这是本章最重要的一条: DH 提供机密性,但完全不提供认证。 裸的 DH 在真实网络上毫无意义。
怎么修:
| 方法 | 做法 | 用在哪 |
|---|---|---|
| 签名认证的 DH ⭐ | 双方对自己的 DH 公钥签名 | TLS 1.3 |
| 预共享密钥 | 用 PSK 派生或验证 | IoT、WireGuard |
| 口令认证(PAKE) | 用双方都知道的口令,且不泄露口令 | Wi-Fi WPA3(SAE)⭐ |
| 指纹校验 | 人工比对短指纹 | Signal 的"安全码" |
🔄 四、前向保密:DH 最重要的贡献
因果链
对比:
| 密钥交换方式 | 服务器私钥泄露后 |
|---|---|
| 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 章)
🔀 六、现代实践:混合加密
因果链
现代的标准形态叫 KEM(密钥封装机制):
信息关系
🔗 和站内其他章的关系
| 相关的地方 | 和这一章的关系 |
|---|---|
| 第 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 让双方协商共同秘密,但它本身不验证对方身份。
- 认证与密钥派生补齐真实协议需要的环节。
- 临时密钥及其销毁关系到前向保密;实际数据通常再由对称方案保护。
下一节 👉 16-椭圆曲线.md