2.6 Generating the Poly1305 Key Using ChaCha20 (使用 ChaCha20 生成 Poly1305 密钥)
2.6 Generating the Poly1305 Key Using ChaCha20 (使用 ChaCha20 生成 Poly1305 密钥)
如第 2.5 节所述, 以伪随机方式生成一次性 Poly1305 密钥是可以接受的。本节定义这样一种方法。
要生成这样的密钥对 (r,s), 将使用第 2.3 节中描述的 ChaCha20 块函数。这假定我们有一个专门用于消息认证码 (Message Authentication Code, MAC) 函数的 256 位会话密钥。任何规定在某协议中将 Poly1305 用作 MAC 算法的文档都必须规定为完整性密钥分配 256 位。请注意, 在第 2.8 节定义的 AEAD (Authenticated Encryption with Associated Data, 带关联数据的认证加密) 构造中, 加密与密钥生成使用同一密钥。
该方法是使用以下参数调用块函数:
-
256 位会话完整性密钥用作 ChaCha20 密钥。
-
块计数器置为零。
-
协议将规定 96 位或 64 位 nonce。对于同一密钥的每次调用, 该 nonce 必须唯一, 因此绝对不能随机生成。计数器是实现这一点的良好方式, 但其他方法 (例如线性反馈移位寄存器 (Linear Feedback Shift Register, LFSR)) 也可以接受。本文规定的 ChaCha20 需要 96 位 nonce。因此, 若提供的 nonce 仅为 64 位, 则 nonce 的前 32 位将设为一个常数。该常数通常为零, 但对于具有多个发送方的协议, 不同发送方可使用不同常数, 但特定发送方在以同一密钥对该函数的所有调用中应该使用相同常数。
运行块函数后, 得到 512 位状态。取序列化状态的前 256 位, 用作一次性 Poly1305 密钥: 前 128 位经钳位 (clamp) 后形成 "r", 接下来的 128 位成为 "s"。其余 256 位丢弃。
请注意, 许多协议为加密算法规定了 nonce (常称为初始化向量 (Initialization Vector, IV)), 但通常不为 MAC 函数做类似规定。此时, 每次调用所需的 nonce 必须从别处获得, 例如消息计数器。
2.6.1 Poly1305 Key Generation in Pseudocode (Poly1305 密钥生成的伪代码)
poly1305_key_gen(key,nonce):
counter = 0
block = chacha20_block(key,counter,nonce)
return block[0..31]
end
2.6.2 Poly1305 Key Generation Test Vector (Poly1305 密钥生成测试向量)
本例中, 设定如下:
密钥:
000 80 81 82 83 84 85 86 87 88 89 8a 8b 8c 8d 8e 8f ................
016 90 91 92 93 94 95 96 97 98 99 9a 9b 9c 9d 9e 9f ................
Nonce:
000 00 00 00 00 00 01 02 03 04 05 06 07 ............
使用密钥, nonce 以及块计数器零时的 ChaCha 状态设置:
61707865 3320646e 79622d32 6b206574
83828180 87868584 8b8a8988 8f8e8d8c
93929190 97969594 9b9a9998 9f9e9d9c
00000000 00000000 03020100 07060504
经过 20 轮后的 ChaCha 状态:
8ba0d58a cc815f90 27405081 7194b24a
37b633a8 a50dfde3 e2b8db08 46a6d1fd
7da03782 9183a233 148ad271 b46773d1
3cc1875a 8607def1 ca5c3086 7085eb87
输出字节:
000 8a d5 a0 8b 90 5f 81 cc 81 50 40 27 4a b2 94 71 ....._...P@'J..q
016 a8 33 b6 37 e3 fd 0d a5 08 db b8 e2 fd d1 a6 46 .3.7...........F
该输出也是用于 Poly1305 的 32 字节一次性密钥。