纯 Rust 编写的可移植 RSA 实现。
use rsa::{Pkcs1v15Encrypt, RsaPrivateKey, RsaPublicKey};
let mut rng = rand::rng();
let bits = 2048;
let priv_key = RsaPrivateKey::new(&mut rng, bits).expect("failed to generate a key");
let pub_key = RsaPublicKey::from(&priv_key);
// Encrypt
let data = b"hello world";
let enc_data = pub_key.encrypt(&mut rng, Pkcs1v15Encrypt, &data[..]).expect("failed to encrypt");
assert_ne!(&data[..], &enc_data[..]);
// Decrypt
let dec_data = priv_key.decrypt(Pkcs1v15Encrypt, &enc_data).expect("failed to decrypt");
assert_eq!(&data[..], &dec_data[..]);
注意: 如果你在使用
RsaPrivateKey::new时遇到异常缓慢的密钥生成时间,可以尝试以发布模式编译,或在Cargo.toml中添加以下内容。在更高的优化级别下构建时,密钥生成会快得多,但这会稍微增加编译时间。[profile.debug] opt-level = 3
目前处于第一阶段 (v) 🚧
在 1.0 🚢 发布之前,还有三个阶段。
此 crate 已接受一次 由 Include Security 进行的安全审计,仅发现一个轻微问题,且该问题已被解决。
其他已知问题请参阅我们问题跟踪器上的[未解决安全问题]。
值得注意的是,[模幂运算的实现并非恒定时间],但时间变化通过常用的[随机盲化]技术进行了掩盖。 此 crate 容易受到 [Marvin 攻击] 的影响,网络攻击者可能借此恢复私钥(参见 RUSTSEC-2023-0071)。
你可以在 #390 中关注我们缓解此问题的工作。
此 crate 支持 Rust 1.85 或更高版本。
未来 MSRV 可能会更改,但会通过次版本号升级来进行。
你可以自行选择采用以下任一许可证:
除非你另有明确说明,否则根据 Apache-2.0 许可证的定义,你为本作品有意提交的任何贡献,均将按上述双重许可证授权,不附加任何额外条款或条件。