#chacha20-poly1305 #aead #poly1305 #chacha20 #crypto

chacha20-poly1305-aead

纯Rust实现RFC 7539中的ChaCha20-Poly1305 AEAD

3个版本

使用旧的Rust 2015

0.1.2 2016年2月1日
0.1.1 2016年1月31日
0.1.0 2016年1月30日

#2164 in 密码学

Download history 361/week @ 2024-03-30 197/week @ 2024-04-06 261/week @ 2024-04-13 269/week @ 2024-04-20 248/week @ 2024-04-27 239/week @ 2024-05-04 234/week @ 2024-05-11 229/week @ 2024-05-18 240/week @ 2024-05-25 281/week @ 2024-06-01 139/week @ 2024-06-08 261/week @ 2024-06-15 227/week @ 2024-06-22 88/week @ 2024-06-29 85/week @ 2024-07-06 215/week @ 2024-07-13

655 monthly downloads
用于 9 个crate(8个直接使用)

MIT/Apache

65KB
1.5K SLoC

这是一个从RFC 7539中实现的纯Rust ChaCha20-Poly1305 AEAD。

设计

加密/解密API主要有两种设计:一个是拥有一个状态/上下文结构体,其中包含一个方法,该方法被反复调用以加密/解密下一个数据片段;另一个是只有一个独立函数,该函数一次调用完成所有工作。

对于认证加密,在解密过程中,验证认证标签之前不产生任何输出是很重要的。这需要对数据进行两次遍历以进行解密:第一次遍历验证标签,第二次遍历进行输出。使用状态/上下文结构体来实现这一功能将过于复杂,因此此crate使用单个函数调用来完成整个解密。为了对称性,加密函数也使用了相同的设计。

基本原语(ChaCha20和Poly1305)没有单独暴露,因为它们更难以安全使用。这也允许它们的实现针对组合使用情况进行优化;例如,基本原语不需要缓冲。

限制

单个调用中可以加密的数据量是2^32 - 1个64字节的块,略小于256 GiB。如果需要,可以通过允许使用较短的nonce将此限制增加到2^64字节。

此crate不尝试从其工作内存中清除可能敏感的数据(包括栈和处理器寄存器)。要正确地完成此操作而不会带来沉重的性能损失,需要编译器的帮助。最好不要尝试这样做,以免提供错误的保证。

SIMD优化

此crate具有实验性的显式SIMD优化支持。由于使用不稳定的特性,它需要nightly Rust。

以下cargo功能启用显式SIMD优化

  • simd 启用显式使用SIMD向量而不是普通结构体
  • simd_opt 此外还启用使用SIMD洗牌来实现一些旋转

虽然人们可能认为这些优化中的每一个都比上一个更快,并且都比没有启用显式SIMD向量要快,但这并不总是如此。这取决于目标架构和编译器选项。如果您需要这些优化带来的额外速度,请对每个优化进行基准测试(bench功能启用了这个crate中的cargo bench,因此您可以使用例如cargo bench --features="bench simd_opt")。目前它们已经被调整以支持SSE2(x86和x86-64)和NEON(arm)。

许可证

根据以下任一许可证授权:

任选其一。

贡献

除非您明确声明,否则根据Apache-2.0许可证定义的,您有意提交以包含在作品中的任何贡献,都将按照上述方式双授权,不附加任何额外条款或条件。

依赖

~245KB