🏠 总目录📚 本教程 15 · DH 与 ElGamal
📑 本页目录(点开跳转)

15 · DH 与 ElGamal

22 分钟 | ⭐⭐ 那个"不用见面也能共享秘密"的魔术


🎯 一句话

两个从没见过面的人,在一条被完全监听的信道上聊几句, 就能得到一个只有他们俩知道的共享密钥。 窃听者听到了全部对话,却什么也算不出来 —— 这在 1976 年之前被认为是不可能的。

AliceBob公开信道(谁都能看)公共参数 g、p私钥 a(不公开)私钥 b(不公开)g^ag^b互相发送(可以被窃听)g^(ab)g^(ab)=两个人在完全公开的信道上,协商出一个只有他们知道的秘密⭐ 窃听者看到了 g、p、g^a、g^b,却算不出 g^(ab) —— 这叫离散对数难题⚠️ 但 DH 本身【不认证身份】:中间人可以两边各做一次 DH,双方都毫无察觉
两人在完全公开的信道上,协商出一个只有他们知道的秘密。⭐ 窃听者看到了 g、p、g^a、g^b,却算不出 g^(ab)。⚠️ 但 DH 本身不认证身份 —— 中间人可以两边各做一次 DH,双方毫无察觉。
AB同一把钥匙同一把钥匙密文对称加密但钥匙怎么先送过去?ABB 的公钥B 的私钥密文非对称加密但公钥可以公开传两者不是替代关系,是配合关系⭐ 真实系统的做法:用非对称加密「传一把对称钥匙」,之后全部用对称加密走数据 —— 这就是 TLS 握手在干的事
对称加密快,但钥匙怎么先送过去是个死结;非对称慢,但公钥可以公开传。⭐ 真实系统两者配合:用非对称传一把对称钥匙,之后全走对称 —— 这就是 TLS 握手。

🎨 一、先用颜色理解(不需要数学)

   ① 双方公开约定一个【公共颜色】:黄色 🟡
   ② 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}$ 是群里的一个元素,它的比特分布不均匀必须过一次 KDFkey = 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 缺认证的现代翻版:通道加密了,不等于对面是谁被验证过

✅ 检查点

  1. 用颜色类比解释 DH 的原理。
  2. DH 的四个步骤是什么?窃听者面对的是什么问题?
  3. 为什么共享的 g^ab 不能直接当密钥用?
  4. DH 的致命缺陷是什么?描述中间人攻击。
  5. 修补 DH 认证缺失的四种方法?
  6. 什么是前向保密?举例说明它防的是什么场景。
  7. 为什么 TLS 1.3 删掉了 RSA 密钥传输?
  8. ElGamal 相比 DH 解决了什么问题?它的两个实现坑是什么?
  9. 什么是混合加密?为什么必须这样做?
👀 答案
  1. 双方公开约定黄色,各自私下选一个颜色混进去后公开发送,收到对方的混合色后再加入自己的私有色——两边得到同一个颜色。窃听者要配出它必须从混合色里分离出对方的私有色,而混合容易分离极难
  2. 公开 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 问题
  3. 因为 g^ab 是群里的元素,比特分布不均匀。必须过 KDFkey = HKDF(g^ab, salt, info)
  4. 完全不提供认证。中间人 Mallory 分别和 Alice、Bob 各做一次 DH,居中转发,双方都以为在和对方通话。裸 DH 在真实网络上毫无意义。
  5. 签名认证的 DH(TLS 1.3)②预共享密钥(WireGuard)③口令认证 PAKE(WPA3 的 SAE)④人工指纹校验(Signal 安全码)。
  6. 临时的、用完即删的 DH 密钥对(ECDHE)。效果:攻击者今天录下全部流量、一年后偷到服务器长期私钥,仍解不开去年的流量。防的是"先收集,等以后再解密"——情报机构录存流量等待未来拿到密钥或量子计算机。
  7. 因为 RSA 密钥传输没有前向保密——服务器私钥一旦泄露,所有历史流量全部可解密。不是 RSA 不安全,是它缺这个性质。
  8. DH 需要双方在线交互,ElGamal 让你能给离线的人发加密消息。两个坑:①r 绝不能重复(否则 c₂/c₂' = M/M' 泄露明文比值)②必须在素数阶子群上做,否则 DDH 不成立。
  9. 用公钥方法协商一个对称密钥,再用对称加密(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

打卡记录保存在你的浏览器里,首页能看到总进度