端对端加密(E2EE)-参考文章
Signal协议可以实现用户之间具有完美前向安全的端对端加密异步通信。具体协议包括四篇文章:
(1)The XEdDSA and VXEdDSA Signature Schemes
(2)The X3DH Key Agreement Protocol
(3)The Double Ratchet Algorithm
(4)The Sesame Algorithm: Session Management for Asynchronous Message Encryption
读者可按以上顺序依次阅读。
1.预备知识:
阅读Signal协议前,你需要知道的基本概念有对称加密(AES)、非对称加密(也称公钥加密RSA,ECC),数字签名,哈希,密钥交换(DH,ECDH)。
比如公钥密码中的椭圆曲线知识可阅读:
离散对数和椭圆曲线加密原理 - 那些零零散散的算法 - CSDN博客blog.csdn.net
或者
ECDH可阅读:
DH密钥交换和ECDH原理(转) - Fish_Ou - 博客园www.cnblogs.com
2.内容概要
2.1The XEdDSA and VXEdDSA Signature Schemes
这篇文章主要是讲如何将常用来做ECDH密钥交换的椭圆曲线Curve25519和Curve448,也用来做数字签名。转化为数字签名算法就是XEdDSA和VXEdDSA。用来做数字签名的曲线就是Ed25519,Ed448,两种曲线分别对应不同的安全级别。
容易混淆的几点有:
(1)X25519,X448和椭圆曲线Curve25519和Curve448的差别(前者是DH函数,后者是具体的椭圆曲线,前者是后者椭圆曲线上的运算)。
(2)Ed25519,Ed448和Curve25519和Curve448的差异,这两者分别是曲线的不同表达形式,一个是 Twisted Edwards曲线(适合做签名曲线) ,一个是Montgomery曲线(适合做DH曲线),两者之间可以相互转化(一个曲线上的点可以对应到另外一个曲线上的点),这也是为什么Curve25519和Curve448的公私钥对可以用来做数字签名。
2.2The X3DH Key Agreement Protocol
X3DH是ECDH的扩展,用来在通信双方之间建立共享密钥。相比ECDH,它最大的不同就是引入了第三方服务器的角色,使得X3DH可以实现某一方在离线的时候也可以进行密钥交换来建立共享密钥,同时根据用户唯一的身份密钥提供身份认证,以及前向安全性。
为了实现上述的功能,需要用户提前在服务器存储自己的身份密钥IK,带签名的预存密钥SPK,以及一组一次性密钥OPK。上传了以上密钥到三方服务器后,其他用户就可以根据这些密钥异步地和用户协商共同密钥,而不需用户保持在线。协商密钥的消息上传到服务器,等用户上线的时候再去获取计算共同密钥。
2.3The Double Ratchet Algorithm
Double Ratchet的名字来源于它是Symmetric Ratchet和DH Ratchet的结合,这个算法用来提供在通信过程中的前向安全性。Double Ratchet之前通常进行一次X3DH过程协商一个共同密钥。 Symmetric Ratchet 可通过哈希函数链式的输出,以保证每条消息都能使用不同的消息密钥来加解密以保证通信的前向安全性。而DH ratchet则通过Ping-Pong的交互方式,定期地更新Symmetric Ratchet中更新消息密钥的Chain Key,能保证break-in recovery的安全性,和 Symmetric Ratchet的安全性形成互补。
2.4The Sesame Algorithm: Session Management for Asynchronous Message Encryption
Sesame主要讲异步加密通信中的会话管理,尤其是用户有多个设备时候的管理,要保证用户不同设备之间的消息都能够同步,两个设备之间只有一个活跃会话,增加和删除设备时需要增加或者删除对应的session等。
Sesame的核心是以设备为单位来建立会话,给某个用户发送消息时就需要给这个用户的所有设备发送消息,同时自己的其他设备也要发送。为了实现设备间的会话管理,Sesame主要引入了UserID,DeviceID,UserRecord,DeviceRecord的概念。用户的设备的UserRecord中存储与其通信的用户的UserID以及这个用户的所有设备的记录DeviceRecord。DeviceRecord中会有设备ID,以及用来加解密消息的active session。