当前位置:文档之家› X3DH密钥协商协议官方手册(中文版)

X3DH密钥协商协议官方手册(中文版)

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

相关主题