The X3DH Key Agreement Protocol X3DH密钥协商协议原作者:Moxie Marlinspike原编辑:Trevor Perrin中文版翻译:pior原文版本:Revision 1, 2016-11-04中文译本:V0.1, 2020-04-27目录1 简介 (3)2 预备知识 (3)2.1 X3DH参数 (3)2.2 密码符号 (3)2.3 角色 (4)2.4 密钥 (4)3 X3DH协议 (5)3.1 概述 (5)3.2 发布密钥 (5)3.3 发送初始消息 (6)3.4 接收初始消息 (8)4 安全要素 (8)4.1 身份认证 (8)4.2 协议重放 (9)4.3 重放与密钥重用 (9)4.4 可否认性 (9)4.5 签名 (10)4.6 密钥泄露 (10)4.7 服务器信任 (11)4.8 身份绑定 (11)5 知识产权 (11)6 致谢 (11)7 参考 (12)1简介本文描述了“X3DH”(也称为“扩展的三重Diffie-Hellman”)密钥协商协议。
X3DH协议基于公私钥认证,在通信两方之间建立共享密钥。
X3DH协议提供了转发保密性和加密可否认性。
X3DH协议是为异步通信而设计的,若“Bob”离线,用户“Alice”也可使用“Bob”已向服务器发布的一些信息向其发送加密数据,并为将来的通信建立共享密钥。
2预备知识2.1X3DH参数使用X3DH协议的应用程序必须确定几个参数,见表1:表 1 X3DH参数表名称定义椭圆曲线类型 25519 or X448散列函数 一个256位或512位的散列函数(例如:SHA-256、SHA-512)信息 标识应用程序的ASCII字符串例如,应用程序可以选择椭圆曲线X25519、散列函数SHA-512和信息“MyProtocol”,应用程序还必须定义一个编码函数encode(PK),以便将X25519或X448的公钥PK编码为字符串。
建议的编码函数由一些表示椭圆曲线类型的单字节常量组成,然后是u坐标的小尾数编码[1]。
2.2密码符号本文在描述X3DH协议时,将使用以下符号:●X||Y,表示字符串X和Y的连接。
●DH(PK1,PK2),表示由椭圆曲线Diffie-Hellman函数输出的密钥,参数PK1和PK2表示两个不同密钥对的公钥。
椭圆曲线Diffie-Hellman函数可选X25519或X448函数,具体取决于椭圆曲线参数。
●Sig(PK,M),表示用公钥PK对应的私钥对消息M进行签名,如XEdDSA数字签名机制,可用公钥PK进行签名验证。
XEdDSA的签名和验证功能参见[2]。
●KDF(KM),表示由HKDF算法生成的32字节输出,HKDF算法要求的输入有:-HKDF 输入密钥材料 = F||KM,其中:KM:是包含密钥材料的输入字符串如果椭圆曲线参数是X25519,F是包含32个0xFF字节的字符串;如果椭圆曲线参数是X448,F是包含57个0xFF字节的字符串。
F用于使用XEdDSA进行加密域分离[2]。
-HKDF salt=长度等于散列函数输出长度的零填充字符串。
-HKDF info=来自X3DH参数中的信息。
2.3角色X3DH协议涉及三方:Alice、Bob和Server。
●Alice(发送方):希望加密的向Bob(接收方)发送一些初始数据,并建立可用于双向通信的共享密钥。
●Bob(接收方):希望允许像Alice这样的各个发送方与他建立共享密钥并发送加密数据。
然而,当Alice试图这样做时,Bob可能会离线。
为了实现这一点,可能过某个服务器建立联系。
●Server(服务器):可以存储从Alice到Bob的消息,Bob稍后可以检索这些消息。
服务器还允许Bob发布一些数据,服务器将向Alice这样的各个发送方提供这些数据。
第4.7节讨论了服务器的信任问题。
在某些系统中,服务器角色可能被划分为多个实体,但为了简单起见,我们假设一个服务器为Alice和Bob提供上述功能。
2.4密钥X3DH协议需要使用以下的密钥:表 2 密钥表名称定义IK-A Alice的身份认证密钥(identity key)EK-A Alice的临时密钥(ephemeral key)IK-B Bob的身份认证密钥(identity key)SPK-B Bob的已签名预共享密钥(signed prekey)OPK-B Bob的一次性预共享密钥(one-time prekey)所有公钥都有相应的私钥,但为了简化描述,我们将重点关注公钥。
X3DH协议中使用的公钥必须全部采用同样的格式,根据曲线参数[1]指定。
每一方都有一个长期身份认证公钥(Alice为IK-A,Bob为IK-B)。
Bob有一个已签名预共享密钥SPK-B,Bob将定期更新它。
Bob还有一组(多个)一次性预共享密钥OPK-B,每个都在一个X3DH协议中使用。
译注:预共享密钥,是指它们本质上是Bob与Alice开始协议运行之前发布到服务器的公钥。
在每次协议交互,Alice都会生成一个新的临时密钥对,公钥为EK-A。
完成的协议交互后,Alice和Bob将共享一个32字节的密钥SK。
这个密钥可以在后面的进行业务通信的X3DH后协议中使用,但要遵循第4章中的安全考虑。
3X3DH协议3.1概述X3DH协议过程主要有三个阶段组成:1.Bob将他的预共享密钥发布到服务器。
2.Alice从服务器获取Bob对应的“预共享密钥包”,并使用它向Bob发送一条初始消息。
3.Bob接收并处理Alice的初始消息。
以下各节将解释这些阶段。
3.2发布密钥Bob向服务器发布一组椭圆曲线公钥,其中包含:●Bob的身份认证公钥IK-B●Bob的已签名预共享密钥SPK-B●Bob的预共享密钥签名Sig(IK-B,Encode(SPK-B))●一组Bob的一次性预共享密钥(OPK-B1、OPK-B2、OPK-B3,…)Bob只需要将他的身份认证公钥上载到服务器一次。
但是,Bob可以在其他时间上载新的一次性预共享密钥(例如,当服务器通知Bob服务器的一次性预密钥存储越来越少时)。
Bob还将每隔一段时间(例如,一周一次或一个月一次)上载一个新的已签名预共享密钥SPK和预共享密钥签名。
新的已签名预共享密钥SPK和预共享密钥签名将替换以前的值。
上传一个新的已签名预共享密钥后,Bob可能会将与前一个已签名预共享密钥相对应的私钥保留一段时间,以便使用它处理在传输过程中延迟的消息。
最后,Bob应该删除这个私钥来进行前向保密(当Bob使用这些密钥接收消息时,一次性预共享密钥私钥将被删除;请参阅第3.4节)。
3.3发送初始消息为了与Bob进行X3DH协议,Alice联系服务器并获取包含以下信息的“预共享密钥包”:●Bob的身份认证公钥IK-B●Bob的已签名预共享密钥SPK-B●Bob的预共享密钥签名Sig(IK-B,Encode(SPK-B))●(可选)Bob的一次性预共享密钥(OPK-B)服务器应该提供Bob的一个一次性预密钥(如果存在),然后将其删除。
如果服务器上Bob的所有一次性预共享密钥都已删除,则该“预共享密钥包”将不包含一次性预共享密钥。
Alice对“预共享密钥包”验证预共享密钥签名,如果验证失败,则中止协议。
Alice生成一个临时密钥对,公钥为EK-A。
如果“预共享密钥包”不包含一次性预共享密钥,Alice进行以下计算: DH1 = DH(IK-A,SPK-B)DH2 = DH(EK-A,IK-B)DH3 = DH(EK-A,SPK-B)SK = KDF(DH1 || DH2 || DH3)如果“预共享密钥包”包含一次性预共享密钥,计算过程添加以下DH算法,并修改SK的计算:DH4 = DH(EK-A,OPK-B)SK = KDF(DH1 || DH2 || DH3 || DH4)下图显示了密钥之间的DH计算。
注意:DH1和DH2提供相互认证,而DH3和DH4提供前向保密。
图 1 DH1…DH4在计算SK之后,Alice删除临时密钥对的私钥和DH计算的中间输出值。
然后,Alice计算包含双方身份信息的“关联数据”对应的AD字符串:AD = Encode(IK-A) || Encode(IK-B)译注:Encode为章节2.1中所说明的参数。
计算AD时,Alice可以选择性地添加其他附加信息,例如Alice和Bob的用户名、证书或其他标识信息。
然后,Alice向Bob发送一条初始消息,其中包含:●Alice的身份认证公钥IK-A●Alice的临时密钥EK-A●说明使用哪个OPK-B的标识符●初始密文,用AEAD加密方案[4]进行加密,使用“关联数据”AD作为相关数据,并使用一个加密密钥,该密钥可以是SK,也可以是由SK加密的PRF的输出初始密文通常是X3DH协商后的X3DH后协议中的第一条消息。
换句话说,这个密文通常有两个角色,在一些X3DH后协议中作为第一个消息服务,并且作为Alice的X3DH初始消息的一部分。
在发送之后,Alice主可以继续在X3DH后协议中使用SK或从SK派生的密钥来与Bob通信,但要符合第4节中的安全考虑。
3.4接收初始消息Bob在收到Alice的初始消息后,从消息中检索Alice的身份认证公钥IK-A和临时密钥EK-A。
并加载他自己的身份认证公钥IK-B对应私钥,以及Alice 所用的SPK-B和OPK-B(如果有的话)相对应的私钥。
使用这些键,Bob重复上一节中的DH和KDF计算以派生SK,然后删除DH 计算的值。
用前一节所述的方法,Bob使用IK-A和IK-B构造AD字符串。
最后,Bob 尝试使用SK和AD解密初始密文。
如果初始密文未能解密,则Bob中止协议并删除SK。
如果初始密文解密成功,则Bob的协议已完成。
Bob将删除用于前向保密的一次性预共享密钥OPK-B的私钥。
然后,Bob可以继续使用SK或派生自SK 的密钥来与Alice进行X3DH后协议,但需遵循第4节中的安全考虑。
4安全要素4.1身份认证在X3DH密钥协议之前或之后,双方可以通过某种经过身份验证的通道验证其身份认证公钥IK-A和IK-B。
例如,他们可以手动或通过面对面扫描二维码来验证公钥。
具体方法不在本文档的范围内。
如果不执行公钥的身份验证,则双方通信将无法得到安全保证。
译注:通过第三方可信CA的数字证书,也可以实现身份验证。
4.2协议重放如果Alice的“初始消息”没有使用一次性预共享密钥OPK,那么它可能会被人截获并重放到Bob,并且Bob会接受它。
这可能会使Bob认为Alice反复给他发了同样的信息。
为了减轻这种情况,X3DH后协议可以据Bob新生成的随机输入与Alice快速协商新的加密密钥。