#aes-key #security-key #encryption-key #aes-kwp #kwp #kw

no-std aes-kw

NIST 800-38F AES密钥包装(KW)和带填充的密钥包装(KWP)模式

3个不稳定版本

0.2.1 2022年4月20日
0.2.0 2022年2月10日
0.1.0 2022年1月6日
0.0.0 2022年1月3日

#2578 in 加密学

Download history 4672/week @ 2024-03-25 5188/week @ 2024-04-01 4964/week @ 2024-04-08 5446/week @ 2024-04-15 6255/week @ 2024-04-22 5883/week @ 2024-04-29 7632/week @ 2024-05-06 8142/week @ 2024-05-13 8010/week @ 2024-05-20 5711/week @ 2024-05-27 5483/week @ 2024-06-03 6092/week @ 2024-06-10 7355/week @ 2024-06-17 4561/week @ 2024-06-24 4589/week @ 2024-07-01 5120/week @ 2024-07-08

21,912 每月下载量
60 个crate中使用 (4 直接使用)

MIT/Apache

24KB
315 代码行

RustCrypto: AES密钥包装算法

crate Docs Apache2/MIT licensed Rust Version Build Status

纯Rust实现NIST AES-KW密钥包装和NIST AES-KWP带填充的密钥包装模式,这些模式也描述在RFC3394RFC5649中。

关于

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