在阅读Whatsapp的安全白皮书时,我发现了“棘轮”一词。



消息密钥是从发送者的链密钥派生而来的,该链密钥
随着每个发送的消息“棘轮”前进。此外,每次消息往返都要执行新的ECDH
协议,以创建新的
链密钥。通过立即“哈希棘轮”和往返“ DH棘轮”的组合
,可以提供前向保密性。


#1 楼

棘轮只是一种每次只能向前移动一次的装置,非常类似于固定领带筋(这是棘轮装置)。因此,如果您过去拥有状态值,则可以计算所有未来值。

在Wikipedia上看到的棘轮:



此图显示了一个圆形齿轮,这有点误导;状态永远不会重复。想象一下,几乎是无限大的车轮或横肋。


然而,应该不可能用较新的值之一来计算先前的状态值。通常,这是通过单向函数(例如哈希或PRF)完成的。在这种情况下,将使用基于散列的PRF:HMAC-SHA256。


然后将链密钥更新为Chain Key = HMAC-SHA256(Chain Key, 0x02)


为了使车轮沿一个方向逐步前进,棘轮还驱动车轴:产生输出。在这种情况下,将使用另一次PRF运行来计算用于产生输出的状态。这将确保输出密钥材料不能用于计算其基于的状态值。


Message Key = HMAC-SHA256(Chain Key, 0x01)



这部分内容在这种情况下,棘轮是在将棘轮推进到下一个状态之前执行的。


除了上述棘轮之外,还为此WhatsApp方案执行了DH密钥协议。 Root Key是状态,棘轮是:


 Chain Key, Root Key = HKDF(Root Key, ephemeral_secret)



您可以看到根密钥再次用于计算下一个根密钥。但是在这种情况下,密钥协商期间计算出的临时密钥会提供其他输入。


注意:



PRNG也可能使用棘轮,尽管基于计数器的构造也很常见;
硬件棘轮通常具有释放棘爪的释放装置(图片中的项目2);领带和加密棘轮没有这种功能。
密码安全的PRF(哈希或MAC)的大周期大小可确保状态不重复。


评论


$ \ begingroup $
评论不用于扩展讨论;此对话已移至聊天。
$ \ endgroup $
– SEJPM♦
18/12/6在15:16