3. Implementation Advice (实现建议)
3. Implementation Advice (实现建议)
每个 ChaCha20 块涉及加载状态时的 16 次移动操作和 1 次递增操作, 轮函数中各 80 次 XOR (异或), 加法与 roll (循环移位) 操作, 以及保护明文时额外的 16 次加法与 16 次 XOR 操作。第 2.3 节将 ChaCha 块函数描述为 "adding the original input words" (把原始输入字加回)。这意味着在对 ChaCha 状态开始轮运算之前, 我们会把状态复制到一旁, 只在最后再把它加回去。这样做是正确的, 但若改为复制状态并在副本上运算, 则可以节省少量操作。这样, 对于下一块你无需重新构造状态, 只需递增块计数器即可。这可节省约 5.5% 的时钟周期。
不建议将 OpenSSL 等通用大整数库用于 Poly1305 的算术运算。此类库使用动态分配以处理任意大小的整数, 但这种灵活性会以性能以及侧信道安全性为代价。存在更高效且在恒定时间 (constant time) 内运行的实现, 其中之一见于 D. J. Bernstein 本人的库 NaCl ([NaCl])。一种恒定时间但并非最优的做法是朴素地实现 288 位整数的算术运算, 因为即使在 (acc+block) 与 r 的乘法中, 朴素实现也不会超过 2^288。高效恒定时间实现可见于公有领域库 poly1305-donna ([Poly1305_Donna])。