跳到主要内容

6. Diffie-Hellman

6. Diffie-Hellman

6.1. Curve25519

X25519函数可以在椭圆曲线Diffie-Hellman (ECDH, Elliptic Curve Diffie-Hellman) 协议中使用, 如下所示:

Alice在a[0]到a[31]中生成32个随机字节, 并将 K_A = X25519(a, 9) 传输给Bob, 其中9是基点的u坐标, 编码为值为9的字节, 后跟31个零字节。

Bob同样在b[0]到b[31]中生成32个随机字节, 计算 K_B = X25519(b, 9), 并将其传输给Alice。

使用他们生成的值和接收到的输入, Alice计算 X25519(a, K_B), Bob计算 X25519(b, K_A)。

现在双方共享 K = X25519(a, X25519(b, 9)) = X25519(b, X25519(a, 9)) 作为共享密钥。双方可以在不泄露关于K值的额外信息的情况下检查K是否为全零值, 如果是则中止 (见下文)。然后Alice和Bob可以使用包含K、K_A和K_B的密钥派生函数来派生对称密钥。

对全零值的检查源于这样一个事实: 如果X25519函数对对应于小阶点的输入进行操作, 其中阶整除曲线的余因子 (参见第7节), 则会产生该值。可以通过对所有字节进行OR运算并检查结果是否为零来执行检查, 因为这消除了软件实现中的标准侧信道。

测试向量:

Alice的私钥, a:

77076d0a7318a57d3c16c17251b26645df4c2f87ebc0992ab177fba51db92c2a

Alice的公钥, X25519(a, 9):

8520f0098930a754748b7ddcb43ef75a0dbf3a0d26381af4eba4a98eaa9b4e6a

Bob的私钥, b:

5dab087e624a8a4b79e17f8b83800ee66f3bb1292618b6fd1c2f8b27ff88e0eb

Bob的公钥, X25519(b, 9):

de9edb7d7b7dc1b4d35b61c2ece435373f8343c85b78674dadfc7e146f882b4f

他们的共享密钥, K:

4a5d9d5ba4ce2de1728e3bf480350f25e07e21c947d19e3376f09b3c1e161742

6.2. Curve448

X448函数可以在ECDH协议中使用, 与X25519函数非常相似。

如果要使用X448, 唯一的区别是Alice和Bob生成56个随机字节 (而不是32个), 并计算 K_A = X448(a, 5) 或 K_B = X448(b, 5), 其中5是基点的u坐标, 编码为值为5的字节, 后跟55个零字节。

与X25519一样, 双方可以在不泄露关于K值的额外信息的情况下检查结果共享K是否为全零值, 如果是则中止。

测试向量:

Alice的私钥, a:

9a8f4925d1519f5775cf46b04b5800d4ee9ee8bae8bc5565d498c28dd9c9baf574a9419744897391006382a6f127ab1d9ac2d8c0a598726b

Alice的公钥, X448(a, 5):

9b08f7cc31b7e3e67d22d5aea121074a273bd2b83de09c63faa73d2c22c5d9bbc836647241d953d40c5b12da88120d53177f80e532c41fa0

Bob的私钥, b:

1c306a7ac2a0e2e0990b294470cba339e6453772b075811d8fad0d1d6927c120bb5ee8972b0d3e21374c9c921b09d1b0366f10b65173992d

Bob的公钥, X448(b, 5):

3eb7a829b0cd20f5bcfc0b599b6feccf6da4627107bdb0d4f345b43027d8b972fc3e34fb4232a13ca706dcb57aec3dae07bdc1c67bf33609

他们的共享密钥, K:

07fff4181ac6cc95ec1c16a94a0f74d12da232ce40a77552281d282bb60c0b56fd2464c335543936521c24403085d59a449a5037514a879d