目录
1. 协议介绍
signal protocol是由Open Whisper Systems提供的端到端加密通信协议,任何第三方包括服务器都无法查看通信内容,可应用在公开信道中加密传输文本、图片、音频、视频等。signal protocol具备前向和后向安全,即使某个消息的密钥泄露,黑客也无法破解之前和之后的消息,facebook messenger、whatsapp、singal app热门应用都采用该协议来保护消息的安全传输。
2. DH协议
迪菲-赫尔曼密钥交换协议(Diffie-Hellman key exchange,简称DH协议),通讯双方无需预先沟通,可在不安全的网络环境中协商产生可用于对称加密的会话密钥对通信内容进行加密的共享秘密,避免密钥泄露风险。
2.1 DH协议原理
假设Alice和Bob要进行加密通信,需协商产生一个可用于生成消息密钥的共享秘密,DH协议的原理可用下面公式来表示:
DH(A的私钥,B的公钥)=共享秘密S=DH(B的私钥,A的公钥)
使用DH协议计算共享秘密所需的参数为自己的私钥和对方的公钥。Alice和Bob均拥有自身的私钥和公钥,只需获取对方的公钥,就能计算出相同的共享秘密S,计算流程如下:
2.2 经典DH算法
基于离散对数问题的经典的Diffie-Hellman 密钥协商方案,公开参数包括阶乘法群
及其生成元
和素数
。Alice,Bob使用DH协议协商产生共享秘密的流程如下:
(1)Alice选取一个随机数,计算
,并将A发送给Bob;
(2)Bob选取一个随机数,计算
,并将B发送给Alice;
(3)Alice计算;
(4)Bob计算。
为Alice和Bob的共享秘密。
3. signal协议
signal协议通过X3DH和双棘轮算法,让通信参与者可在不安全的公开信道中协商产生安全的会话密钥,下面分别介绍X3DH、双棘轮算法及signal协议的密钥生成算法。
3.1 X3DH
X3DH(extended Triple Diffie-Hellman key exchange)是增强版的DH密钥交换协议,参与者包括会话发起者、会话接收者以及服务器3种角色,服务器用于存储所有用户的各种公钥。通信用户拥有如下4种密钥:
- 身份密钥(Idendity Key, IK):长期的符合DH协议的密钥对,用户注册时创建,与用户身份绑定;
- 已签名的预共享密钥(Signed PreKey, SPK):中期的符合DH协议的密钥对,用户注册时创建,由身份私钥签名后上传至服务器保存,并定期更新;
- 一次性共享密钥(One Time PreKey, OPK):一次性使用的密钥对队列,安装时生成,不足时服务器提醒补充;
- 临时密钥(ephermeral Key, EPK):会话时临时生成的用于创建初始消息密钥S以及用于生成KDF第一个input。
假设Alice欲与Bob进行加密通信,他们之间通过X3DH协商产生共享密钥S的流程如下:
(1)Alice 从服务器上下载Bob的3种密钥对的公钥:身份密钥、已签名的预共享密钥
和预共享密钥的签名Sig、一次性预共享密钥
;
(2)Alice 验证预共享密钥的签名Sig,验证通过后创建一个临时密钥对EK-A;
(3)Alice使用DH协议计算协商的共享密钥,具体计算方式如下:
(4)Alice计算消息密钥;
(5)Alice使用消息密钥S对消息进行加密,连同自己的身份公钥、临时公钥
及本次协商所使用的Bob的一次性密钥标识一同发给Bob;
(6)Bob收到Alice的信息后,取出Alice的2个公钥,结合和被使用的私钥
、
,使用与Alice相同的算法计算消息密钥S。
3.2 棘轮算法
signal protocol采用双棘轮算法生成消息密钥,通过“KDF棘轮”+ “DH棘轮”,保证消息的前向安全和后向安全。使用KDF棘轮,实现每条消息使用不同的密钥,同时确保一条消息的密钥被破解了,敌手也只能根据已知信息推算后面消息的密钥,而不能向前推算历史消息的密钥,也就是保持了棘轮的单向性,称之为前向安全;其次,如果通过反向的DH棘轮算法(即前文介绍的X3DH协议),在保障前向安全的基础上保障后向安全,即一条消息的密钥被破解,一定时间后,敌手便无法根据已知信息推算出之前和之后的消息密钥。
如下图所示为KDF棘轮,根据KDF key和输出其他参数Input,得到的无法预测的输出被分为2部分,一部分接着作下一次计算的输入KDF key,一部分作本次迭代的输出密钥Output key。
3.3 密钥协商算法
基于X3DH协议,Alice和Bob2使用对身份密钥对可协商生成一个安全的会话密钥,更换其中的任何一个密钥对,协商的产生的会话密钥(X3DH Output)也会发生改变。双棘轮算法就是通信参与者使用X3DH协议并轮流更换密钥对,每次生成不同的协商密钥(X3DH Output)作为KDF棘轮算法的Input,由KDF棘轮算法派生出最终的消息加密密钥,以此确保所生成的加密密钥既是前向安全的,也是后向安全的。