11

密钥总账速查

Cheatsheet · 10 种 Key

每种 Key 的所有者 · 生命周期 · 公私属性 · 解决的问题 · 派生关系

📋 全套 Signal Protocol 共出现 10 种密钥/中间值, 每种解决一个特定问题, 缺任何一个都会破坏某项安全属性 符号 全名 所有者 公/私 生命周期 解决什么问题 所在阶段 IK Identity Key 长期身份密钥 用户 (终身) 公+私 注册时生成 · 永不变 身份认证 (这就是 Bob 本人) X3DH (DH₁, DH₂) SPK Signed PreKey 中期签名密钥 用户 (周/月) 公+私 周期轮换 · IK 签名认证 中期可用性 + IK 失窃风险隔离 X3DH (DH₁, DH₃) OTK One-Time PreKey 一次性密钥 用户 (单次) 公+私 用过即丢 · 池化管理 额外前向安全 + 防 replay (详见 #09) X3DH (DH₄) EK Ephemeral Key 临时会话密钥 发送方 (单会话) 公+私 每次 X3DH 临时生成 单次会话隔离 · 同时充当首条 ratchet_key X3DH + DR 启动 SharedSec Shared Secret 共享秘密 双方独立算 私 · 永不上行 X3DH 出来即转化为 RK₁ X3DH 与 Double Ratchet 的桥 X3DH 终点 RK Root Key 跨棘轮主键 双方独立算 每次 DH 翻转后更新 后向安全 (Post-Compromise) DH Ratchet Sec_n DH Sec 翻转中间值 双方独立算 私 · 用完即丢 单次 ping-pong 期间 把对方"新公钥"喂给 KDF 推进 RK DH Ratchet (详见 #04) CK Chain Key 单链推进键 本端 同链内长期 · DH 翻转时 reset 前向安全的"齿轮齿" Symmetric Ratchet MK Message Key 消息加密键 本端 私 · 用完即丢 单条消息 (毫秒级) 直接加密一条消息 (AES-GCM) Symmetric Ratchet (详见 #03) ratch_key ratchet_key 消息携带的公钥 发送方 公 · 上行 直到对方"也翻" 通知对方"我的新公钥来了, 请翻" 每条 DR 消息头 总计: 6 种长期/中期/单会话密钥 + 4 种瞬时派生值 = 完整 Signal Protocol 状态 🌳 密钥派生关系图 ⬛ Tier 1 — 客户端预先持有的"原料" IK 长期 SPK 中期 (含签名) OTK 一次性 EK 临时 ⬛ Tier 2 — X3DH 产物 SharedSec = 初始 RootKey₁ → 接力 ⬛ Tier 3 — DH Ratchet 主链 (跨轮) RK₁ RootKey RK₂ RK₃ Sec_n 每次 DH 翻转喂入 ⬛ Tier 4 — Symmetric Ratchet 子链 (单轮) RK 翻转 → 派生新 CK CK₀ SendChain CK₁ advance CK₂ MK₁ MK₂ ↓ 每个 CK 派生 MK ratchet_key = 当前自己的 EK^pub / SK^pub 每条 MK 加密的 msg 都附带 EK 退化为长期 ratchet 的"信号灯" 💡 6 种持久密钥 (IK, SPK, OTK×N, EK, RK, CK) + 4 种瞬时派生值 (SharedSec, Sec_n, MK, ratchet_key) = 完整 Signal 状态
💡 一句话理解: Signal 的 10 种密钥/派生值看似繁多, 但每一种都有不可替代的作用—— 去掉 IK 失去身份、去掉 SPK 失去中期可用、去掉 OTK 失去额外前向、去掉 EK 失去会话隔离、 去掉 RK 失去后向安全、去掉 CK/MK 失去前向安全、去掉 ratchet_key 双方无法同步翻转。 理解这张表 = 理解整个 Signal Protocol 的状态空间。

📚 基础知识速查 · Reference

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

分类密钥按生命周期分类

long-term (终身, 如 IK), medium-term (周/月, 如 SPK), ephemeral (单会话, 如 EK), derived (单条消息, 如 MK)。

越短命 → 前向安全越强

安全FS vs PCS

Forward Secrecy 保护过去 (KDF 单向), Post-Compromise Security 保护未来 (DH 注入新熵)。Signal 同时提供。

FS ⇄ PCS · 时间方向上对称

概念派生 vs 协商

派生 (Derivation) = 单方计算 (KDF), 协商 (Agreement) = 双方互动 (DH)。两者协同支撑整个协议。

derive: KDF · agree: DH

实现vodozemac::Message

Olm/vodozemac 的消息 struct, 5 个字段: version / ratchet_key / chain_index / ciphertext / mac。直接对应本图谱。

pub struct Message { version, ratchet_key,
chain_index, ciphertext, mac }