#aes #sha-3 #post-quantum-cryptography #ed448 #mlkem

bin+lib capycrypt

高级密码学工具包,用于安全消息交换

16 个版本 (5 个重大更新)

0.7.5 2024年7月7日
0.6.4 2023年12月11日
0.4.7 2023年11月10日
0.3.1 2023年6月20日

#258 in 密码学

Download history 192/week @ 2024-06-29 133/week @ 2024-07-06 3/week @ 2024-07-13

897 每月下载量

MIT 许可证

280KB
2K SLoC

capyCRYPT - 一个完整的 Rust 密码系统

Build Status Crates.io License: MIT

实现了以下功能:

这些原语构成了一个支持多种密码操作的平台,具体如下。

安全性

这个库是一个关于密码学算法设计的学术练习,用爱心构建。尽管它很棒,但现在可能不适合用于任何严肃的事情。如果您发现让它变得更好的方法,请提交问题或PR,我们将乐意参与。

功能

  • AES: 符合NIST标准的 高级加密标准 (AES) 实现用于加密和解密数据。

  • 爱德华椭圆曲线: 高性能、抗侧信道攻击的 Ed448-Goldilocks 曲线实例,用于非对称操作。

  • SHA-3: 符合NIST标准的 安全哈希算法3 (SHA-3) 实现用于生成加密散列值、对称密钥流和PRNG。

  • ML-KEM 768: 符合NIST初始公开草案 (IPD) 标准的 环学习错误密钥封装机制 (ML-KEM) 用于量子安全非对称密钥和消息交换。

支持的操作

  • 消息摘要: 计算给定消息的散列值,可调整摘要长度。
  • MAC: 计算给定消息的消息认证码,可调整位安全性。
  • 共享密钥: 对称消息加密和解密。
  • 公钥密码学: 在公钥下进行非对称消息加密,用私钥解密。
  • 签名: 使用Schnorr/ECDHIES签名证明和验证对秘密信息的了解。
  • 量子安全消息交换: 使用ML-KEM + SHA3发送和接收任意长度的量子安全加密。

安装

将以下行添加到您的 Cargo.toml 文件中

cargo add capycrypt

快速入门

量子安全加密/解密

use capycrypt::{
    kem::{encryptable::KEMEncryptable, keypair::kem_keygen},
    sha3::aux_functions::byte_utils::get_random_bytes,
    Message, SecParam,
};

// Get 5mb random data
let mut msg = Message::new(get_random_bytes(5242880));

// Create a new ML-KEM public/private keypair
let (kem_pub_key, kem_priv_key) = kem_keygen();
// Encrypt the message
msg.kem_encrypt(&kem_pub_key, SecParam::D256);
// Decrypt and verify
assert!(msg.kem_decrypt(&kem_priv_key).is_ok());

椭圆曲线加密/解密

use capycrypt::{
    ecc::{encryptable::KeyEncryptable, keypair::KeyPair},
    sha3::aux_functions::byte_utils::get_random_bytes,
    Message, SecParam,
};

// Get 5mb random data
let mut msg = Message::new(get_random_bytes(5242880));

// Create a new elliptic-curve public/private keypair
let key_pair = KeyPair::new(
    &get_random_bytes(64),   // random password for key
    "test key".to_string(),  // label
    SecParam::D256,         // bit-security for key
);
// Encrypt the message
msg.key_encrypt(&key_pair.pub_key, SecParam::D256);
// Decrypt and verify
assert!(msg.key_decrypt(&key_pair.priv_key).is_ok());

对称加密/解密

use capycrypt::{
    aes::encryptable::AesEncryptable,
    sha3::{aux_functions::byte_utils::get_random_bytes, 
    encryptable::SpongeEncryptable},
    Message, SecParam,
};
// Get a random password
let pw = get_random_bytes(16);
// Get 5mb random data
let mut msg = Message::new(get_random_bytes(5242880));
// Encrypt the data
msg.aes_encrypt_ctr(&pw);
// Decrypt the data
assert!(msg.aes_decrypt_ctr(&pw).is_ok());
// Encrypt the data
msg.sha3_encrypt(&pw, SecParam::D512);
// Decrypt and verify
assert!(msg.sha3_decrypt(&pw).is_ok());

Schnorr 签名

use capycrypt::{
    ecc::{keypair::KeyPair, signable::Signable},
    sha3::aux_functions::byte_utils::get_random_bytes,
    Message, SecParam,
};
// Get random 5mb
let mut msg = Message::new(get_random_bytes(5242880));
// Create a new elliptic-curve public/private keypair
let key_pair = KeyPair::new(
    &get_random_bytes(64),  // random password for key
    "test key".to_string(), // label
    SecParam::D256,        // bit-security for key
);
// Sign with 128 bits of security
msg.sign(&key_pair, SecParam::D256);
// Verify signature
assert!(msg.verify(&key_pair.pub_key).is_ok());

计算摘要

use capycrypt::{sha3::hashable::SpongeHashable, Message, SecParam};
// Hash the empty string
let mut data = Message::new(vec![]);
// Obtained from echo -n "" | openssl dgst -sha3-256
let expected = "a7ffc6f8bf1ed76651c14756a061d662f580ff4de43b49fa82d80a4b80f8434a";
// Compute a SHA3 digest with 128 bits of security
data.compute_sha3_hash(SecParam::D256);
assert!(hex::encode(data.digest) == expected);

性能

这个库使用 criterion crate 进行基准测试。运行

cargo bench

按照从最低安全到最高的顺序对参数集进行基准测试。

对称操作与 openSSL 相当。在 Intel® Core™ i7-10710U × 12 上,我们从 XKCP 适配的 in-place keccak,处理 5mb 随机数据的运行时间约为 20 毫秒,而 openSSL 约为 17 毫秒。

(可能的) 量子后安全

该库将 ML-KEM-768 与 SHA3-sponge 构造相结合,用于量子安全的公钥密码系统。它通过使用基于量子对手难以解决的假设问题的 KEM 和 sponge 原语,提供了理论上的量子安全性。此设计使用 KEM + 会话 nonce 共享的密钥初始化 SHA-3 sponge,然后可以高效地加密/解密任意长度的消息。

我们的构造是非标准的,尚未经过同行评审,也没有任何正式审计。我们的 ML-KEM 库 本身仍在开发中,仅支持推荐的 NIST-II 安全参数集 768。此外,当前的 FIPS 203 IPD(正如其名称所示)是一个草案,关于安全实现的最终细节可能有所变动。我们的设计目前仅存在于这个库中,作为一种学术好奇心。使用时请自行承担风险,我们不提供关于安全性、可靠性或效率的任何保证。

致谢

作者衷心感谢 Barreto 博士为该库的初始设计以及 Edward 曲线功能的理论框架所做的贡献。我们还要感谢 curve-dalek 作者在此 和在此 ,对于出色的参考实现和坚固的密码学实例表示感谢。

我们的 KEM 受 Filippo Valsorda 的优秀 ML-KEM 文章和 go 实现 以及 Tony Arcieri 的出色的 rust-crypto 实现 此处 的启发。

依赖关系

~18–31MB
~467K SLoC