3个不稳定版本
0.2.1 | 2022年4月20日 |
---|---|
0.2.0 | 2022年2月10日 |
0.1.0 | 2022年1月6日 |
0.0.0 |
|
#2578 in 加密学
21,912 每月下载量
在 60 个crate中使用 (4 直接使用)
24KB
315 代码行
RustCrypto: AES密钥包装算法
纯Rust实现NIST AES-KW密钥包装和NIST AES-KWP带填充的密钥包装模式,这些模式也描述在RFC3394和RFC5649中。
关于
RFC3394 § 2描述AES-KW如下
AES密钥包装算法旨在包装或加密密钥数据。密钥包装在64位块上操作。在包装之前,密钥数据被解析为n个64位块。
密钥包装算法对n的唯一限制是n至少为两个。(对于长度小于或等于64位的密钥数据,本规范中使用的常量字段与密钥数据形成一个128位的代码本输入,使得此密钥包装成为不必要的。)密钥包装算法适用于所有支持的AES密钥大小。然而,其他加密值通常需要被包装。其中一个值是DSS随机数发生器的种子。此种子值要求n大于四。毫无疑问,其他值也需要此类保护。因此,不对n施加上限。
AES密钥包装可以配置为使用AES代码本支持的任何三种密钥大小。密钥大小的选择会影响密钥包装提供的整体安全性,但它不会改变密钥包装算法的描述。因此,在以下描述中,密钥包装被通用描述;未指定KEK的密钥大小。
RFC5649 § 1描述AES-KWP如下
本文件指定了高级加密标准(AES)密钥包装算法 [AES-KW1, AES-KW2] 的扩展。没有此扩展,AES密钥包装算法的输入(称为密钥数据)必须是一系列两个或多个64位块。
AES密钥封装填充算法可用于将任何实用大小的密钥用AES密钥封装。AES密钥加密密钥(KEK)必须是128位、192位或256位。输入密钥数据可以短至一个八位字节,这将导致输出两个64位块(或16个八位字节)。尽管AES密钥封装算法没有对可封装的密钥数据大小的最大限制,但此扩展做了限制。使用32位固定字段来携带密钥数据的八位长度将输入大小限制在2^32个八位字节。大多数系统将具有其他因素,这些因素将密钥数据的大小限制在2^32个八位字节以下。
用法
使用AES-KW最常见的方法如下:您提供密钥封装密钥和要封装的密钥,然后封装它,或者提供封装密钥并解封装它。
# fn main() -> Result<(), Box<dyn std::error::Error>> {
# #[cfg(feature = "std")]
# {
use aes_kw::Kek;
use hex_literal::hex;
let kek = Kek::from(hex!("000102030405060708090A0B0C0D0E0F"));
let input_key = hex!("00112233445566778899AABBCCDDEEFF");
let wrapped_key = kek.wrap_vec(&input_key)?;
assert_eq!(wrapped_key, hex!("1FA68B0A8112B447AEF34BD8FB5A7B829D3E862371D2CFE5"));
let unwrapped_key = kek.unwrap_vec(&wrapped_key)?;
assert_eq!(unwrapped_key, input_key);
# }
# Ok(())
# }
或者,AES-KWP可以用于封装不是8字节倍数的密钥。
# fn main() -> Result<(), Box<dyn std::error::Error>> {
# #[cfg(feature = "std")]
# {
use aes_kw::Kek;
use hex_literal::hex;
let kek = Kek::from(hex!("5840df6e29b02af1ab493b705bf16ea1ae8338f4dcc176a8"));
let input_key = hex!("c37b7e6492584340bed12207808941155068f738");
let wrapped_key = kek.wrap_with_padding_vec(&input_key)?;
assert_eq!(wrapped_key, hex!("138bdeaa9b8fa7fc61f97742e72248ee5ae6ae5360d1ae6a5f54f373fa543b6a"));
let unwrapped_key = kek.unwrap_with_padding_vec(&wrapped_key)?;
assert_eq!(unwrapped_key, input_key);
# }
# Ok(())
# }
支持128/192/256位密钥。
最低支持的Rust版本
此crate至少需要Rust 1.56。
我们可能会在将来更改MSRV,但将伴随着小版本的升级。
许可证
在您选择的情况下,许可如下:
。
贡献
除非您明确声明,否则,您提交给工作以包含在内的任何贡献,如Apache-2.0许可证中定义的,应如上双重许可,没有任何额外的条款或条件。
依赖项
~590KB
~14K SLoC