4. Security Considerations (安全考虑)
4. Security Considerations (安全考虑)
ChaCha20 密码算法的设计目标是提供 256 位安全性。
Poly1305 认证器 (authenticator) 的设计目标是: 即使在发送了 2^64 条合法消息之后, 对于长度为 16n 字节的消息, 伪造消息仍会以 1-(n/(2^102)) 的概率被拒绝, 因此按 [AE] 中的术语, 它是 SUF-CMA (Strong Unforgeability against Chosen-Message Attacks, 抗选择消息的强不可伪造性) 的。
证明其中任一算法的安全性超出了本文档的范围。此类证明可见于所引用的学术论文 ([ChaCha], [Poly1305], [LatinDances], [LatinDances2] 以及 [Zhenqing2012])。
实现本文档时, 最重要的安全考虑是 ChaCha20 中所用 nonce (一次性数) 的唯一性。计数器与 LFSR (Linear Feedback Shift Register, 线性反馈移位寄存器) 都是生成唯一 nonce 的可接受方式, 使用具有 64 位块大小 (如 DES) 的分组密码加密计数器亦可。注意, 对使用 128 位或 256 位块的分组密码所加密计数器进行截断是不可接受的, 因为此类截断可能在较短时间内重复。
重复 nonce 的后果: 若 nonce 重复, 则两条消息上的一次性 Poly1305 密钥与密钥流 (keystream) 都相同。这会暴露明文的 XOR, 因为明文的 XOR 等于密文的 XOR。
Poly1305 密钥对攻击者必须是不可预测的。随机生成密钥可满足该要求, 但 Poly1305 常用于通信协议, 因而接收方也应知道密钥。通过加密计数器等方式进行伪随机数生成是可以接受的。使用带密钥与 nonce 的 ChaCha 同样可以。
本文介绍的算法旨在易于以恒定时间实现, 从而避免侧信道漏洞。ChaCha20 所用的运算均为加法, XOR 与固定 roll。这些都可以且应该以恒定时间实现。对 ChaCha 状态内部偏移的访问以及运算次数不依赖于密钥的任何性质, 从而消除了通过缓存缺失时序泄露密钥信息的可能。
对于 Poly1305, 运算是加法, 乘法与取模, 对象均为超过 128 位的数。这可以做到恒定时间, 但朴素实现 (例如使用某些通用大整数库) 不会是恒定时间的。例如, 若乘法与模运算分别执行, 结果有时小于 2^256, 有时大于 2^256。实现者应注意通过使用这些运算的适当实现来避免 Poly1305 的时序侧信道。
验证消息的真实性涉及将计算得到的标签 (tag) 与接收到的标签进行按位比较。在大多数用例中, 只有在收到有效消息后 nonce 与 AAD (Associated Authenticated Data, 关联认证数据) 才会被 "消耗"。这使得攻击者可以发送多条仅标签不同的相同消息, 直到有一条通过标签比较。若攻击者必须逐一尝试全部 2^128 个可能标签, 这会很难。然而, 若标签比较操作的时序泄露计算得到的标签与接收到的标签之间相同前缀的长度, 则所需消息数量可大幅减少。因此, 对于在线协议, 实现必须使用恒定时间的比较函数, 而不能依赖经优化但不安全的库函数, 例如 C 语言的 memcmp()。
此外, 任何使用本算法的协议都必须包含完整标签以尽量降低伪造机会。绝对不能进行标签截断 (tag truncation)。