04

DH Ratchet PingPong 时序图

Sequence · 3 轮翻转

每收到对方新公钥就翻一次 · 双方独立算出的 Sec_n 必相等 · 交替前进派生新 RootKey

📜 图例: 密钥协商 / 网络消息 业务消息 (含 ratchet_key + ciphertext) RootKey / Sec_n (双方相等) Alice (发起方) ↓ 时间 Bob (接收方) 📦 init: RootKey₁ (from X3DH) 已知对方 Pb₁ (= Bob 的 SPK_B from X3DH bundle) 📦 init: RootKey₁ (from X3DH) 已发布 Sb₁/Pb₁ pair, 等待 Alice 来消息 ▶ Round 1 ① 生成新 ratchet 密钥对 (Sa₁^priv, Pa₁^pub) = curve25519.gen() ② 计算 Sec₁ Sec₁ = DH(Sa₁^priv, Pb₁^pub) msg₁ : { Pa₁, ciphertext } 用 SK 派生自 Sec₁, 加密一条消息 ③ 收到 msg₁, 取出 Pa₁ 解析 ratchet_key = Pa₁ ④ 计算 Sec₁ (与 Alice 一致) Sec₁ = DH(Sb₁^priv, Pa₁^pub) ✓ ▶ Round 2 ⑤ 生成新 ratchet 密钥对 (Sb₂^priv, Pb₂^pub) = curve25519.gen() ⑥ 计算 Sec₂ Sec₂ = DH(Sb₂^priv, Pa₁^pub) msg₂ : { Pb₂, ciphertext } 用 SK 派生自 Sec₂ ⑦ 收到 msg₂, 取出 Pb₂ ⚡ 触发 DH Ratchet 翻转 ⑧ 计算 Sec₂ (与 Bob 一致) Sec₂ = DH(Sa₁^priv, Pb₂^pub) ✓ ▶ Round 3 ⑨ 生成新 ratchet 密钥对 (Sa₂^priv, Pa₂^pub) = curve25519.gen() ⑩ 计算 Sec₃ Sec₃ = DH(Sa₂^priv, Pb₂^pub) msg₃ : { Pa₂, ciphertext } 用 SK 派生自 Sec₃ ⑪ 收到 msg₃, 取出 Pa₂ ⚡ 触发 DH Ratchet 翻转 ⑫ 计算 Sec₃ (与 Alice 一致) Sec₃ = DH(Sb₂^priv, Pa₂^pub) ✓ ⋮ (继续交替) 🎯 关键不变量 (DH 对称性) 数学保证 : DH(Sa^priv, Pb^pub) ≡ DH(Sb^priv, Pa^pub) (curve25519 离散对数对称性) 推论 : 每个 Sec_n 双方独立算出 — 不需在网络上传 Sec, 中间人只能看到公钥 作用 : Sec_n 接力作为 KDF 输入, 持续推进 RootKey₁ → RootKey₂ → RootKey₃ → … (后向安全的根本) 📈 Sec 接力 : Sec₁ (Sa₁ × Pb₁) Sec₂ (Sa₁ × Pb₂) Sec₃ (Sa₂ × Pb₂) Sec₄ (Sa₂ × Pb₃) → 喂给 KDF → 翻 RootKey 💡 带走结论 DH Ratchet = 双方交替更新 ratchet_key, 每次 ping-pong 都让对方算出新 Sec → 持续派生新 RootKey
规则

谁先发,谁先翻

  • • 想发消息 → 必须有自己的最新 ratchet 密钥对
  • • Alice 发消息前生成 (Sa, Pa),把 Pa 放进消息头
  • • Bob 收到后才能算出新 Sec → 翻转 RootKey
  • • 任一方"沉默"会阻塞 ratchet 翻转
Sec_n

Sec 命名规律

  • • Sec₁ = Alice 第一对 × Bob 第一对(X3DH)
  • • Sec₂ = Alice 不变 × Bob 新一对(Bob 翻)
  • • Sec₃ = Alice 新一对 × Bob 不变(Alice 翻)
  • • 每次只换一方的密钥,另一方"留作下次配对"
数学

DH 对称性 — 安全的根

  • • curve25519: 椭圆曲线 Diffie-Hellman
  • • 两端都能算出相同 Sec, 不需传输 Sec
  • • 中间人只能看到公钥, 算不出 Sec(离散对数难题)
  • • 这是后向安全的数学基础
💡 一句话理解: DH Ratchet 像两个人轮流"交换签名"—— Alice 把新公钥贴在消息头里发出去, Bob 收到后用它算新 Sec; 反之亦然。 每次 ping-pong 都让 RootKey 翻一个新版本, 攻击者拿到旧 RootKey 也追不上下一次翻转。

📚 基础知识速查 · Reference

不熟悉以下底层概念? 这里是 30 秒回顾。

椭圆曲线Curve25519

现代密码学的事实标准曲线。X25519 = curve25519 上的 ECDH, EdDSA = 上面的签名算法。256-bit 安全 ≈ RSA-3072。

RFC 7748 (X25519) · RFC 8032 (Ed25519)

数学ECDH 对称性

椭圆曲线上的 Diffie-Hellman 满足: 双方各自用自己的私钥与对方公钥相乘, 得到相同的曲线点。

x25519(a, b·G) = x25519(b, a·G)

概念公钥 / 私钥

私钥是 32 字节随机数, 公钥 = 私钥 × 椭圆曲线生成元。私钥本地保密, 公钥可放心公开。

P_pub = sk · G (G 是固定生成元)

工程Curve25519 优势

运算快 (常数时间)、抗侧信道 (无分支)、不需要可信参数。现代 IM/VPN 几乎全部使用。

WhatsApp · Signal · WireGuard · TLS 1.3