01

Signal Protocol 全景总览

God-View · 黑盒接口

三大组件如何协作 — X3DH 启动 · DH Ratchet 翻转 · Symmetric Ratchet 派生消息密钥

Phase A · Bootstrap (一次性) Phase B · 持续运转 Phase C · 每条消息一个 ✦ 解决: 离线协商 · 身份认证 ✦ 解决: 后向安全 (Post-Compromise) ✦ 解决: 前向安全 (Forward Secrecy) Alice's Keys IK_A · EK_A (临时) 发送方持有 Bob's PreKeys IK_B · SPK_B · OTK_B via Server 支持离线发送 ① X3DH Initial Key Agreement 输入: 双方密钥组合 操作: 4× DH + KDF 输出: SharedSec ⚡ 一次性 · 仅 bootstrap ↓ 详见 #07 / #08 ② DH Ratchet 外层棘轮 · 主链 状态: RootKey ↻ 触发: 收对方新公钥 动作: DH+KDF 翻转 ⚡ 注入新随机性 ↓ 详见 #04 / #05 ③a Sending Ratchet 内层棘轮 · 加密用 每条消息一个 MK · 用完即丢 ↓ 详见 #03 ③b Receiving Ratchet 内层棘轮 · 解密用 对端 SendChain 的镜像 · 支持乱序 ↓ 详见 #06 encrypt → 密文 to Bob ciphertext + MAC + ratchet_key decrypt ← 密文 from Bob ciphertext + MAC + ratchet_key SharedSec = 初始 RootKey 派生 Send Chain 派生 Recv Chain 💡 带走结论 Signal Protocol = 一次 X3DH 启动 + 持续运转的双棘轮 (DH 跨轮翻转 + Symmetric 跨消息派生) 视觉编码: RootKey / 边界 Sending (发送方向) Receiving (接收方向) Server / 第三方 虚线 = 边界标注 / 网络消息

X3DH · 离线协商

  • • 输入:Alice 临时密钥 + Bob 预发布的 IK/SPK/OTK
  • • 用 4 次 DH 计算混合长期/中期/一次性密钥
  • • 输出:双方独立算出的 SharedSec(必相等)
  • • 一次性,仅会话首次启动

DH Ratchet · 后向安全

  • • 状态:跨棘轮的 RootKey
  • • 触发:收到对方新 ratchet_key 时翻转一次
  • • 每次翻转都注入新随机性 (DH)
  • • 即使 RootKey 被攻破,未来消息仍安全

Symmetric Ratchets · 前向安全

  • • Alice 的 SendChain = Bob 的 RecvChain
  • • 每发/收一条消息推进一格 ChainKey
  • • MessageKey 用完即丢,KDF 单向不可逆
  • • 即使 MK_n 泄漏,前面消息仍安全
💡 一句话理解: X3DH 像点火器(启动一次),DH Ratchet 像变速箱(不断换挡注入新熵), Symmetric Ratchet 像车轮(每转一圈派生一个用完即丢的消息密钥)。 三者协同 = 离线可达 + 后向安全 + 前向安全。

📚 基础知识速查 · Reference

不熟悉以下底层概念?这里是 30 秒回顾。点开图前后随时翻阅。

算法Diffie-Hellman 密钥交换

双方各持私钥, 交换公钥后能算出相同的 shared secret, 但中间人只看到公钥算不出。

Sec = DH(Sa^priv, Pb^pub) = DH(Sb^priv, Pa^pub)

算法KDF (Key Derivation Function)

把高熵的 key 加上公开的 context, 单向映射成新 key 的函数。Signal 用 HKDF / HMAC-SHA256。

output = KDF(secret, context)

算法HMAC-SHA256

带密钥的哈希, 输出 32 字节固定值。密码学单向性 → 无法从输出反推输入。

mac = HMAC(key, data)

概念前向安全 (Forward Secrecy)

即使长期密钥泄漏, 过去会话的密钥仍不可恢复。工程实现要点: 临时密钥用完即丢。

又称 PFS · Perfect Forward Secrecy