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向服务器发布一组椭圆曲线公钥,其中包含: