双棘轮算法
在密码学中,双棘轮算法(,以前称为Axolotl Ratchet[1][2])是由Trevor Perrin和Moxie Marlinspike在2013年开发的密钥管理算法。它可以用作安全协议的一部分。为即時通訊系统提供端到端加密。在初始密钥交换之后,它管理持续更新和维护短期会话密钥。它结合了基于迪菲-赫爾曼密鑰交換(DH)的密码棘轮和基于密钥派生函数(KDF)的棘轮,例如散列函数,因此被称为双棘轮。
通信双方为每个双棘轮消息派生出新密钥,使得旧的密钥不能从新的密钥计算得出。通信双方还将在消息中附加迪菲-赫尔曼公钥值。将迪菲-赫尔曼计算的结果将被混合到派生出的密钥中,使得新的密钥不能从旧的密钥计算得出。在一方密钥泄露的情况下,这些属性为泄漏前或泄漏后加密的消息提供一些保护。[3]
算法概述
KDF链
KDF链是双棘轮算法中的核心概念。KDF是这样一个密码学函数:输入一个秘密且随机的KDF密钥(KDF key)及其它一些输入数据,并返回输出数据。在密钥未知的前提下,输出的数据与随机数不可区分(也就是说,KDF满足密码学「PRF」的要求)。若密钥不是秘密且随机的,则KDF应仍然能作为密钥和输入数据的安全的密码学哈希。当HMAC和HKDF使用安全的哈希算法实例化时,二者的构造即满足KDF定义。[4][5]
我们使用术语KDF链(KDF chain)表示如下流程:一个KDF输出的一部分作为输出密钥(Output key),而另一部分将取代KDF密钥,作为另一个KDF的输入密钥。
一个KDF链具有如下特性[6]:
- 弹性(resilience):对于不知道KDF密钥的攻击者来说,输出密钥看起来是随机的。即使攻击者能控制KDF的输入,此条特性仍然成立。
- 前向安全性:对于知道某一时刻的KDF密钥的攻击者来说,旧的输出密钥看起来是随机的。
- 被攻破后的可恢复性(break-in recovery):对于知道某一时刻的 KDF 密钥的攻击者来说,新的输出密钥看起来是随机的,只要新的输入中增加了足够的熵(entropy)。
在Alice和Bob之间的双棘轮会话中,双方保存的KDF密钥将用于三条链:根链(root chain)、发送链(sending chain)及接收链(receiving chain),Alice的发送链对应Bob的接收链,反之亦然。
Alice和Bob交换消息的同时,也交换新的迪菲-赫尔曼公钥,而迪菲-赫尔曼输出的密钥将作为根链的输入。根链输出的密钥将作为发送链和接收链的KDF密钥。这称为迪菲-赫尔曼棘轮(Diffie-Hellman ratchet)。
每发送和接收一条消息,发送链和接收链都将向前推进。相应的输出密钥将用于加密和解密消息。这称为对称密钥棘轮(symmetric-key ratchet)。
对称密钥棘轮
每条发送或接收的消息都使用一个唯一的消息密钥(message key)加密。消息密钥是发送KDF链和接收KDF链的输出密钥。这些链的KDF密钥称为链密钥(chain key)。
由于发送链和接收链的KDF输入是常数,所以这两条链不具备被攻破后的可恢复性。发送链和接收链只能确保每条消息使用唯一的密钥加密,而此密钥在加密或解密后可以删除。由一个给定的链密钥计算下一个链密钥和消息密钥的过程,称为对称密钥棘轮(symmetric-key ratchet)的棘轮步进(ratchet step)。
由于消息密钥不用于派生其它密钥,因此可以保存起来而不影响其它消息密钥的安全性。这将有助于处理消息的丢失或乱序。
迪菲-赫尔曼棘轮
如果中间攻击者窃取了其中一方的发送链密钥和接收链密钥,那么他可以计算此后所有的消息密钥,并解密对应的消息。为了避免这种情况,双棘轮算法将对称密钥棘轮与DH棘轮组成在一起,使用后者基于迪菲-赫尔曼的输出更新链密钥。
为了实现DH棘轮,通信双方各自生成一个DH密钥对(迪菲-赫尔曼公钥和私钥)作为当前的棘轮密钥对(ratchet key pair)。从任意一方发出的每一条消息都将携带一个消息头,其中包含发送者当前的棘轮公钥。当接收到远端发送过来的新的棘轮公钥时,本端将实施一次DH棘轮步进(DH ratchet step),生成一个新的棘轮密钥对以取代本端当前的密钥对。
通信双方交替地更新棘轮密钥对,使之形成一个「乒乓」行为模式。仅截获了其中一方的窃听者可能得到当前棘轮私钥的值,但此棘轮私钥将最终被未泄露的棘轮私钥取代。那时,棘轮密钥对之间的迪菲-赫尔曼计算将定义一个对攻击者未知的新的DH输出。
双棘轮
将对称密钥棘轮和 DH 棘轮组合在一起,形成了双棘轮:
- 当发送或接收消息时,执行一次发送链或接收链的对称密钥棘轮步进,以派生新的消息密钥。
- 当接收到新的棘轮公钥时,在对称密钥棘轮步进之前,执行一次 DH 棘轮步进,以更新链密钥。
应用
以下是使用双棘轮算法或其定制化实现的应用程序列表:
- ChatSecure[lower-alpha 1]
- Conversations[lower-alpha 1]
- Cryptocat[lower-alpha 1][7]
- Facebook Messenger[lower-alpha 2][lower-alpha 3][8]
- G Data Secure Chat[lower-alpha 3][9][10]
- Gajim[lower-alpha 1][lower-alpha 4]
- Google Allo[lower-alpha 5][lower-alpha 3][11]
- Haven[lower-alpha 3][12][13]
- Pond[14]
- Riot[lower-alpha 6][15]
- Signal[lower-alpha 3]
- Silent Phone[lower-alpha 7][16]
- Skype[lower-alpha 8][lower-alpha 3][17]
- Viber[lower-alpha 9][18]
- WhatsApp[lower-alpha 3][19]
- Wire[lower-alpha 10][20]
备注
- Via the OMEMO protocol
- Only in "secret conversations"
- Via the Signal Protocol
- A third-party plug-in must be installed separately
- Only in "incognito mode"
- Via the Matrix protocol
- Via the Zina protocol
- Only in "private conversations"
- Viber "uses the same concepts of the "double ratchet" protocol used in Open Whisper Systems Signal application"
- Via the Proteus protocol
参考文献
- Perrin, Trevor. . GitHub. 30 March 2016 [9 April 2016]. (原始内容存档于2017-05-07).
- Marlinspike, Moxie. . Open Whisper Systems. 30 March 2016 [31 March 2016]. (原始内容存档于2016-12-28).
- Trevor Perrin, Moxie Marlinspike. . Signal. [2016-11-20]. (原始内容存档于2017-07-08).
- H. Krawczyk, M. Bellare, and R. Canetti, “HMAC: Keyed-Hashing for Message Authentication.” Internet Engineering Task Force; RFC 2104 (Informational); IETF, Feb-1997. http://www.ietf.org/rfc/rfc2104.txt (页面存档备份,存于)
- H. Krawczyk and P. Eronen, “HMAC-based Extract-and-Expand Key Derivation Function (HKDF).” Internet Engineering Task Force; RFC 5869 (Informational); IETF, May-2010. http://www.ietf.org/rfc/rfc5869.txt (页面存档备份,存于)
- B. Barak and S. Halevi, “A model and architecture for pseudo-random generation with applications to /dev/random.” Cryptology ePrint Archive, Report 2005/029, 2005. http://eprint.iacr.org/2005/029 (页面存档备份,存于)
- . Cryptocat. [14 July 2016]. (原始内容存档于2016-04-07).
- Greenberg, Andy. . Wired. Condé Nast. 4 October 2016 [5 October 2016]. (原始内容存档于2017-04-15).
- Seals, Tara. . Infosecurity Magazine. Reed Exhibitions Ltd. 17 September 2015 [16 January 2016]. (原始内容存档于2016-07-22).
- . GitHub. G Data. [14 July 2016]. (原始内容存档于2017-05-07).
- Greenberg, Andy. . Wired. Condé Nast. 18 May 2016 [14 July 2016]. (原始内容存档于2017-02-02).
- . GitHub. Guardian Project. [22 December 2017]. (原始内容存档于2019-06-16).
- Lee, Micah. . The Intercept. First Look Media. 22 December 2017 [22 December 2017]. (原始内容存档于2019-07-19).
- Langley, Adam. . GitHub (GitHub contribution). 9 November 2013 [16 January 2016]. (原始内容存档于2016-12-28).
- Butcher, Mike. . TechCrunch. AOL Inc. 19 September 2016 [20 September 2016]. (原始内容存档于2018-10-18).
- . Github. Silent Circle. [19 December 2017]. (原始内容存档于2019-04-22).
- Lund, Joshua. . Open Whisper Systems. 11 January 2018 [11 January 2018]. (原始内容存档于2020-02-02).
- (PDF). Viber. 25 July 2018 [26 October 2018]. (原始内容存档 (PDF)于2019-07-19).
- Metz, Cade. . Wired. Condé Nast. 5 April 2016 [5 April 2016]. (原始内容存档于2016-04-05).
- . Wire Swiss GmbH. [15 July 2016].
外部链接
- Specification(页面存档备份,存于) by Open Whisper Systems
- "Advanced cryptographic ratcheting(页面存档备份,存于)", abstract description by Moxie Marlinspike
- Olm(页面存档备份,存于): implementation in C++ under the Apache license
本条目包含了自由内容作品内的文本。 在公共领域下释出 《The Double Ratchet Algorithm》, Trevor Perrin (editor), Moxie Marlinspike, 欲了解如何向维基百科条目内添加开放许可证文本,请见这里;欲知如何重用本站文字,请见使用条款。
本条目包含了自由内容作品内的文本。 在公共领域下释出 《双棘轮算法》, Philip Ye(译者), 欲了解如何向维基百科条目内添加开放许可证文本,请见这里;欲知如何重用本站文字,请见使用条款。