Post

【网络安全】双棘轮算法保障前后向安全通俗易懂理解

双棘轮算法

【网络安全】双棘轮算法保障前后向安全通俗易懂理解

双棘轮算法是什么?

双棘轮算法是由特雷弗·佩林和莫克西·马林斯派克于2013年设计的一种密钥管理算法,曾名为蝾螈棘轮算法(axolotl ratchet),常作为即时通讯端到端加密协议的核心部分,比如Signal协议就以它为关键组件,WhatsApp、Facebook Messenger等多款应用的安全通信功能都基于此实现。其核心是结合“KDF棘轮”与“DH棘轮”两种机制,同时保障通信的前向安全和后向安全,以下是具体介绍:

  1. KDF棘轮(保障前向安全) KDF指密钥派生函数,该棘轮的核心是密钥派生链条只能向后派生,无法反向推导。通信中每条消息都会使用不同密钥,这些密钥通过KDF算法依次生成。即便某一条消息对应的密钥被破解,攻击者也只能尝试推导后续的密钥,而无法反向算出之前的历史消息密钥。这种单向性确保了历史通信记录的安全性,也就是前向安全。比如聊天时的第5条消息密钥泄露,前4条消息依然处于加密保护状态。
  2. DH棘轮(保障后向安全) DH即迪菲 - 赫尔曼密钥交换。该棘轮依托DH密钥交换机制,通信双方在交互过程中会不断更新自身的DH密钥对,且发送消息时会附带新的DH公钥。接收方获取新公钥后,会通过DH交换生成新的共享密钥,以此重置KDF棘轮的初始状态。哪怕当前阶段的密钥被破解,随着双方持续更新DH密钥对,后续新生成的密钥与被破解密钥关联性会彻底断开,攻击者无法再推算后续新消息的密钥;同时,因之前的密钥已随棘轮迭代失效,也无法反向追溯更早的密钥,从而实现后向安全。

实际通信时,双棘轮算法的流程通常以X3DH密钥交换为开端,完成初始密钥协商。之后每次发送消息,发送方都会更新自身的密钥链并附上全新的DH公钥;接收方接收消息后,用收到的DH公钥完成自身密钥链的更新,再进行消息解密。这种循环更新的模式,让通信密钥持续动态变化,大幅提升了即时通讯的加密安全性。

通俗易懂地讲解一下其中的原理,为什么能够保障前后向安全

核心原理一句话说透:用“不断换钥匙”的循环逻辑,既防“过去的消息被破解”,也防“现在的密钥泄露影响未来”。

先搞懂两个关键目标

  • 前向安全:就算现在的密钥被偷了,之前发的消息也不会被解密。
  • 后向安全:就算现在的密钥被偷了,之后发的消息也不会被解密。

用“聊天换钥匙”通俗讲原理

可以把双棘轮算法想象成你和朋友用“一次性密码本”聊天,还加了“定期换密码本种子”的规则,具体分两步:

1. KDF棘轮:像撕日历一样用密钥(保前向安全)

  • 你和朋友一开始拿到一个“初始密钥”,就像一本密码本的第一页。
  • 每次发消息,你们都用当前页的密码加密,发完就把这一页撕掉,同时用这一页的密码“衍生”出下一页的新密码(只能往后衍生,没法从下一页倒推回上一页)。
  • 就算有人偷到了第10页的密码,也没法倒着找出第1-9页的密码,之前的聊天记录还是安全的——这就是前向安全。

2. DH棘轮:定期换密码本(保后向安全)

  • 光撕日历不够,万一第10页密码被偷,小偷还能跟着衍生出第11、12页的密码。
  • 所以你们约定:每次发消息时,都给对方递一把“新锁的公钥”(自己留着私钥)。
  • 对方拿到你的新公钥后,用自己的私钥和你的公钥“配对”,生成一个全新的“初始密钥”,相当于直接换了一本新的密码本,之前的密码本就算被偷也没用了。
  • 就算小偷拿到了旧密码本的第10页,新密码本和旧的完全没关系,他没法推导后续的密码——这就是后向安全。

两者配合:双重保障,万无一失

  • 你们聊天时,既在“撕当前密码本的页”(KDF棘轮),又在“定期换全新密码本”(DH棘轮)。
  • 哪怕某一刻的密码被偷,小偷只能看到那一页对应的消息,既没法回头看之前的(前向安全),也没法跟着用新密码本(后向安全)。
  • 而且换密码本的动作是自动的,不用你们额外操作,聊天过程中就完成了动态防护。

具体对话场景

咱们用“小明和小红聊天”的场景,一步步还原双棘轮算法的运作,全程不搞复杂术语:

场景前提

小明和小红要聊悄悄话,怕被别人偷听或破解,就用了双棘轮的“动态换钥匙”规则,一开始通过简单协商拿到了初始共享密钥(相当于第一本密码本的封面)。

第一步:第一次聊天(触发KDF棘轮,保前向安全)

  1. 小明要给小红发第一条消息“今晚吃火锅?”
  2. 他用“初始共享密钥”当密码本第一页,加密消息后发送,同时做两件事:
    • 把第一页密码“撕了”(删除用过的密钥);
    • 用第一页密码衍生出第二页新密码(只能往后推,没法倒回)。
  3. 小红收到消息后,用自己手里的“初始共享密钥”(和小明的完全一致)解密,同时也撕了第一页、衍生出第二页密码。
    • 关键:如果这时有人偷到了第二页密码,也没法倒推出第一页的,所以“今晚吃火锅?”这条历史消息永远安全——这就是前向安全。

第二步:第二次聊天(触发DH棘轮,保后向安全)

  1. 小红要回复“好呀,六点见!”
  2. 她先用密码本第二页加密消息,同时额外生成一对“新锁和钥匙”(DH密钥对):把“新锁”(公钥)附在消息里一起发,自己留着“新钥匙”(私钥)。
  3. 小明收到消息和“新锁”后,先做两件事:
    • 用自己的第二页密码解密,看到回复;
    • 拿出自己刚生成的另一把“新钥匙”,和小红的“新锁”配对,生成一个全新的初始共享密钥(相当于换了一本全新的密码本)。
  4. 小明和小红都把旧密码本(第一、二页)删掉,以后聊天只用新密码本。
    • 关键:如果这时有人偷到了旧密码本的第二页密码,新密码本和旧的完全没关系,他没法推导后续“六点见”之后的消息——这就是后向安全。

第三步:后续聊天(双棘轮循环,双重防护)

  1. 小明再发“要不要带奶茶?”:用新密码本第一页加密,撕页、衍生第二页,同时附上自己的“新锁”。
  2. 小红收到后:用新密码本第一页解密,撕页、衍生第二页,再用自己的“新钥匙”和小明的“新锁”配对,换一本更新的密码本。
    • 循环下去:每发一条消息就“撕页+衍生新页”(KDF棘轮),每收一次“新锁”就“换全新密码本”(DH棘轮)。

最终效果

就算中途某一页密码被偷,小偷只能看到那一页对应的单条消息:

  • 想回头看之前的?旧密码页已被撕,且没法倒推;
  • 想跟着看之后的?已经换了新密码本,和旧密码毫无关联。 这就是双棘轮算法同时保障前后向安全的核心逻辑,全程自动运作,聊天时完全不用额外操作~

计算共享秘密流程

这正是ECDH(椭圆曲线迪菲-赫尔曼)的核心特性——双方用“自己私钥+对方公钥”计算,最终会得到完全相同的共享秘密S

为什么能相等?用通俗逻辑解释

可以把椭圆曲线的运算想象成“特殊的组合规则”,满足一个关键特性:

  • 小明的私钥是“自己的专属密码”,小红的公钥是“小红公开的标记”,两者按规则组合,会得到一个唯一结果S;
  • 小红的私钥是“她的专属密码”,小明的公钥是“小明公开的标记”,按同样规则组合,结果必然和S一模一样。
  • 这个过程就像:小明用“自己的钥匙”开“小红的锁芯”,小红用“自己的钥匙”开“小明的锁芯”,最后打开的是同一个“秘密盒子”,里面的S完全相同。

关键前提(保证安全性)

  • 只有“自己的私钥+对方的公钥”才能算出S,第三方就算拿到双方的公钥,没有任何一方的私钥,也没法算出S;
  • 公钥无法反推出私钥,所以传递公钥的过程完全安全,不怕被截获。

这个相等性是DH棘轮能“换全新密码本”的核心——正因为双方能算出相同的S,再通过KDF加工后,才能得到完全一致的“新初始共享密钥”,后续聊天才能用同一本“新密码本”加密解密~

This post is licensed under CC BY 4.0 by the author.