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 密码学

Download history 1/week @ 2024-06-28 12/week @ 2024-07-05 185/week @ 2024-07-26 14/week @ 2024-08-02 74/week @ 2024-08-09

273 每月下载

MIT许可协议

69KB
606 代码行

ARX-KW

crates.io Docs.rs Rust Report Card dependency status Build Status codecov MIT license


该库实现了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::encryptArxKW::decrypt 方法放入作用域。此包重新导出 subtle 包中的 ConstantTimeEq trait,并在 AuthTag 类型以及由 subtle 提供的泛型实现中实现。

  • 可以使用 ArxKW::encryptArxKW::decrypt 方法执行秘密明文的加密和解密,这些方法消除了跟踪非消息以及如何存储/传输它们的需要。这两个方法将认证标签和密文视为独立的实体;如果需要分别处理它们的灵活性,请使用它们;否则,下面描述的 ArxKW::encrypt_blobArxKW::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