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 密码学
897 每月下载量
280KB
2K SLoC
capyCRYPT - 一个完整的 Rust 密码系统
实现了以下功能:
- AES: NIST FIPS 197
- SHA3: NIST FIPS 202
- ML-KEM: NIST FIPS 203
- E448: Ed448-Goldilocks 曲线
这些原语构成了一个支持多种密码操作的平台,具体如下。
安全性
这个库是一个关于密码学算法设计的学术练习,用爱心构建。尽管它很棒,但现在可能不适合用于任何严肃的事情。如果您发现让它变得更好的方法,请提交问题或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