9个版本
新 0.3.2 | 2024年8月14日 |
---|---|
0.3.1 | 2024年8月14日 |
0.3.0 | 2021年2月1日 |
0.2.13 | 2021年1月25日 |
0.1.11 | 2021年1月20日 |
#320 in 密码学
273 每月下载
69KB
606 代码行
ARX-KW
该库实现了ARX-KW系列新型密钥封装结构的Rust实现。
此crate的版本号将根据语义版本控制进行递增。
背景
ARX-KW首次在这篇论文中提出,由Satō Shinichi撰写,并于2020年1月提交给IACR密码学ePrint档案。正如其名所示,这些结构广泛使用了加-旋转-异或算法:四个变体中的每一个都涉及128位输出的SipHash-2-4伪随机函数和ChaCha系列流密码中的一个流密码。
ARX-KW是一种用于确定性和认证加密的密码,旨在提供强大的真实性和机密性,同时与使用ChaCha密码的现有结构相比,最大限度地减少存储开销和使用简便性。这些现有结构需要保留nonce和块计数器的状态,或者为了无状态地管理nonce状态而有很大的存储开销。
ARX-KW的四个变体每个都静态开销128位,无需保留ChaCha使用的nonce状态,从而使存储开销仅为256位密钥的50%。
用法
特性
使用nightly
特性来启用ChaCha计算的SIMD并行化(需要nightly Rust)
Cargo.toml
[dependencies]
arx-kw = {version = "0.3", features = ["nightly"]}
变体
四个变体分别受单个特性("e"、"g"、"ex"和"gx")控制,以便在不需要所有变体时进行条件编译。默认情况下,所有特性都启用,但例如,如果您只想使用gx::GX
变体
Cargo.toml
[dependencies]
arx-kw = { version = "0.3", default-features=false, features=["gx"] }
何时
如上所述,ARX-KW 构造是 密钥封装 算法,设计和目的是使用对称加密来保护其他加密密钥。需要注意的是,ARX-KW,就像所有密钥封装构造一样,是基于输入数据具有高度熵的预期设计的,这同样适用于秘密加密密钥。这是因为它是一个确定性加密方案,对于给定的输入将始终产生相同的密文输出;如果用于加密低熵数据(如通用加密方案),则容易受到“泄露”的影响,详情见下文。
确定性加密会向窃听者泄露信息,窃听者可能会识别已知的密文。例如,当对手了解到某个密文对应于某些有趣的消息时,他们每次在传输该密文时都会学到一些东西。为了了解各种密文的意义,对手可能会对通过加密通道传输的消息进行统计分析,或者尝试将密文与观察到的行动相关联(例如,注意到一个特定的密文总是在潜艇潜航之前立即接收)。如果用于存储秘密密钥材料(本质上高熵),则这不是问题,因为攻击者无法获取关于封装在其中的密钥的信息。
如何
此包的每个公共模块都包含一个与四个指定的 ARX-KW-8-2-4 变体之一对应的 struct:ARX-8-2-4-E
、ARX-8-2-4-G
、ARX-8-2-4-EX
和 ARX-8-2-4-GX
。如果您不确定使用哪个,推荐使用 gx::GX
。功能由 ArxKW
trait 提供,因此需要将 ArxKW::encrypt
和 ArxKW::decrypt
方法放入作用域。此包重新导出 subtle
包中的 ConstantTimeEq
trait,并在 AuthTag
类型以及由 subtle
提供的泛型实现中实现。
-
可以使用
ArxKW::encrypt
和ArxKW::decrypt
方法执行秘密明文的加密和解密,这些方法消除了跟踪非消息以及如何存储/传输它们的需要。这两个方法将认证标签和密文视为独立的实体;如果需要分别处理它们的灵活性,请使用它们;否则,下面描述的ArxKW::encrypt_blob
和ArxKW::decrypt_blob
方法提供了进一步的可抽象性和易于使用的功能,而不牺牲性能。 -
《ArxKW::encrypt_blob》和《ArxKW::decrypt_blob》方法进一步提高了易用性,允许用户将一个由认证标签和相应的密文组成的《Vec
`》视为单个不透明的blob。因此,不仅ARX-KW解决了nonce管理的问题,而且还解决了认证标签的管理问题!这个blob可以作为一个整体存储或传输,节省了头疼、数据库检索,并使安全的简单方式执行密钥封装变得容易。
设计上,《Eq》和《PartialEq》没有为《AuthTag》实现,以阻止非O(1)的相等性检查,但如果你想要生活,内部的《[u8; 16]》是公开的。
(此处原文为乱码,无法翻译,故保留原文)
br>
示例用法
extern crate hex;
use hex::FromHex;
extern crate arx_kw;
use arx_kw::{
ArxKW,
gx::GX,
ConstantTimeEq, // From the subtle crate, allows for equality checking in constant time
// (impl'd for AuthTag and re-exported by this crate)
assert_ct_eq,
};
fn main() -> Result<(), Box<dyn std::error::Error>> {
// Encrypt a key using ARX-KW-8-2-4-GX with the encrypt_blob method
// The values used here are from the test vectors in the original ARX-KW paper.
/*
* Inputs
*/
// The encryption key we are using to wrap the plaintext secret key
let key = <[u8; 32]>::from_hex("000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f")?;
// The plaintext secret key we want to store/transport securely
let plaintext = <[u8; 32]>::from_hex("deadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef")?;
/*
* Expected output:
* A Vec<u8> containing the authentication tag followed by the ciphertext containing the
* wrapped key. We can treat this as an opaque blob when using the encrypt_blob and decrypt_blob
* methods, meaning we don't have to manually manage authentication tags or nonces.
*/
let blob_expected = <[u8; 48]>::from_hex("016325cf6a3c4b2e3b039675e1ccbc652f83f391c97f3606ccd5709c6ee15d66cd7e65a2aeb7dc3066636e8f6b0d39c3")?;
/*
* Key wrapping performed in one line, simply passing the
* encryption key and the plaintext to be encrypted.
*/
let blob = GX::encrypt_blob(&key, &plaintext)?;
assert_ct_eq!(blob, &blob_expected);
/*
* Decryption likewise is done in one line, passing the key and the blob to be decrypted.
* The authentication tag is checked to match the ciphertext
* during decryption and will return an error if the tags do not match.
* Returns the decrypted plaintext if successful, otherwise an error.
*/
let decrypted_plaintext = GX::decrypt_blob(&key, &blob)?;
assert_ct_eq!(plaintext, &decrypted_plaintext);
Ok(())
}
基准测试
benches目录包含每个ARX-KW变种的加密和解密基准测试。这个crate使用《criterion》crate进行基准测试,因此基准测试可以在稳定版或nightly Rust上运行,并提供了更详细的输出。
我的基准测试
在我的机器上使用《criterion》crate,使用《nightly》特性,在3.8 GHz的Ryzen 1700和3000MHz的8GB RAM上运行。
更喜欢自己运行吗?
要运行不带SIMD的基准测试
cargobench
要运行带SIMD的基准测试
cargo --featuresnightly bench
如果你在没有nightly特性时运行基准测试,然后带有它,输出将显示执行时间的变化,对于那些好奇的人来说。
测试
为四种变种的加密和解密提供了测试,并使用原始ARX-KW论文中的测试向量,以及一些doctests。可以使用《cargo test》运行它们。
文档
最新crate版本的文档在此处可用
或在此存储库主分支的最新提交
依赖项
~0.5–1MB
~21K SLoC