市场上最安全的通信协议——Signal协议解析(上)之X3DH

X3DH协议

本文基本上是对Signal白皮书的翻译加上个人理解和最简代码示例。

1. 介绍

本文件描述了 "X3DH"(或 "扩展的三重 Diffie-Hellman")密钥协议。X3DH在双方之间建立一个共享的秘密密钥,双方根据公开密钥相互验证。X3DH提供前向保密性和密码学上的不可否认性。

X3DH是为异步设置而设计的,其中一个用户("Bob")是离线的,但已经向服务器发布了一些信息。另一个用户("Alice")想使用该信息向Bob发送加密数据,并为未来的通信建立一个共享密匙。

2.准备工作

2.1. X3DH 参数

应用若要使用X3DH,则必须决定以下几个参数:

Name Definition
curve X25519 或 X448
hash 256或512位哈希函数 (比如 SHA-256 或 SHA-512)
info 用于识别应用的硬编码信息

例如,可以选择curve为X25519,hash为SHA-512,info为 "MyProtocol"。

应用程序必须另外定义一个编码函数Encode(PK)来将X25519或X448公钥PK编码为一个字节序列。推荐的编码包括一些单字节的常数来表示曲线的类型,然后是u坐标的小端序字节编码,如[1]中规定的那样。

2.2. 密码学符号

X3DH将使用以下符号。

  • X || Y表示将X和Y字符串直接连起来,如X=”123”,Y=”456”,则X||Y表示“123456”。
  • DH(PK1, PK2)表示一个字节序列,它是一个椭圆曲线Diffie-Hellman函数输出的共享密钥,该函数涉及由公钥PK1和PK2代表的密钥对。椭圆曲线Diffie-Hellman函数将是[1]中的X25519或X448函数,取决于curve参数。
  • Sig(PK, M)代表一个字节序列,它是对字节序列M的XEdDSA签名,并用公钥PK进行验证,它是通过用PK相应的私钥签署M而产生的。XEdDSA的签名和验证功能在[2]中规定。
  • KDF(KM)表示HKDF算法[3]的32个字节的输出、输入。
  • HKDF input key material = F || KM,其中KM是一个包含密钥材料的输入字节序列,F是一个字节序列,如果曲线是X25519,则包含32个0xFF字节,如果曲线是X448,则包含57个0xFF字节。F用于XEdDSA[2]的加密域分离。HKDF salt = 一个零填充的字节序列,其长度等于哈希输出长度。HKDF info = 第2.1节中的信息参数。

2.3. 角色

X3DH协议涉及三个角色。Alice, Bob和Server。

Alice想用加密技术向Bob发送一些初始数据,并建立一个共享的秘密密钥,该密钥可用于双向通信。

Bob想让像Alice这样的另一方与他建立一个共享密钥,并发送加密数据。然而,当Alice试图这样做时,Bob可能是离线的。为了实现这一点,Bob与Server建立了关系。

该Server可以存储从Alice到Bob的信息,Bob随后可以检索这些信息。Server还让Bob发布一些数据,Server将把这些数据提供给Alice等另一方。对Server的信任程度在第4.7节中讨论。

在一些系统中,服务器的角色可能被划分为多个实体,但为了简单起见,我们假设只有一个服务器为Alice和Bob提供上述功能。

2.4.密钥

X3DH使用以下椭圆曲线公钥。

Name Definition
IKA Alice的身份密钥
EKA Alice的临时密钥
IKB Bob的身份密钥
SPKB Bob的预签名密钥
OPKB Bob的一次性预签名密钥

所有的公钥都有一个相应的私钥,但为了简化描述,我们将专注于公钥。

在X3DH协议运行中使用的公钥必须全部为X25519形式,或者全部为X448形式,这取决于曲线参数[1]。

每一方都有一个长期的身份公钥(Alice的IKA,Bob的IKB)。

Bob也有一个签名的预密钥SPKB,他将定期更改,还有一组一次性预密钥OPKB,它们分别用于一次X3DH协议的运行。("预密钥"之所以这样命名,是因为它们基本上是Bob在Alice开始协议运行之前向服务器发布的协议信息)。

在每个协议运行期间,Alice都会生成一个新的带有公钥EKA的临时密钥对。

在一次成功的协议运行后,Alice和Bob将共享一个32字节的秘密密钥SK。这个密钥可以在一些X3DH后的安全通信协议中使用,但要符合第4节中的安全考虑。

3. X3DH协议

3.1.概述

X3DH有三个阶段。

  1. Bob将他的身份密钥和预密钥发布到一个服务器上。
  2. Alice从服务器上获取一个 "预密钥包",并使用它向Bob发送一个初始信息。
  3. Bob收到并处理Alice的初始信息。

下面几节将解释这些阶段。

3.2. 发布公钥

Bob向服务器发布了一组椭圆曲线公钥,其中包含:

  • Bob的身份密钥IKB
  • Bob的签名预密钥SPKB
  • Bob的预密钥签名 Sig(IKB, Encode(SPKB))
  • 一组Bob的一次性预密钥(OPKB1, OPKB2, OPKB3, ...)

Bob只需要向服务器上传一次他的身份密钥。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值