14个版本
0.2.7 | 2024年5月19日 |
---|---|
0.2.6 | 2023年7月29日 |
0.2.3 | 2022年9月24日 |
0.2.2 | 2021年11月23日 |
0.1.1 | 2019年11月13日 |
在加密学类别中排名176
每月下载量4,410次
在20个crate中使用(直接使用10个)
39KB
584 行
eciesrs
Rust中的secp256k1椭圆曲线集成加密方案,基于纯Rust实现的secp256k1。
ECIES功能基于AES-256-GCM和HKDF-SHA256。
这是eciespy的Rust版本。
此库可根据您的选择编译为WASM目标,请参阅WASM兼容性。
快速入门
no_std
默认启用。您可以使用std
功能启用std
。
ecies = {version = "0.2", features = ["std"]}
use ecies::{decrypt, encrypt, utils::generate_keypair};
const MSG: &str = "helloworld🌍";
let (sk, pk) = generate_keypair();
#[cfg(not(feature = "x25519"))]
let (sk, pk) = (&sk.serialize(), &pk.serialize());
#[cfg(feature = "x25519")]
let (sk, pk) = (sk.as_bytes(), pk.as_bytes());
let msg = MSG.as_bytes();
assert_eq!(
msg,
decrypt(sk, &encrypt(pk, msg).unwrap()).unwrap().as_slice()
);
可选的纯Rust AES后端
您可以选择使用OpenSSL实现或纯Rust实现的AES-256-GCM。
ecies = {version = "0.2", default-features = false, features = ["pure"]}
由于一些性能问题,OpenSSL是默认后端。
纯Rust实现有时很有用,例如在WASM上构建
cargo build --no-default-features --features pure --target=wasm32-unknown-unknown
如果您在现代CPU上选择纯Rust后端,请考虑使用以下命令来加速AES加密/解密:
RUSTFLAGS="-Ctarget-cpu=sandybridge -Ctarget-feature=+aes,+sse2,+sse4.1,+ssse3"
WASM兼容性
您还可以使用纯Rust后端构建到wasm32-unknown-unknown
目标。有关更多详细信息,请参阅此仓库。
配置
您可以通过在OpenSSL或纯Rust AES后端上启用aes-12bytes-nonce
功能来启用12字节的nonce。
ecies = {version = "0.2", features = ["aes-12bytes-nonce"]} # it also works with "pure"
您还可以启用纯Rust的XChaCha20-Poly1305后端。
ecies = {version = "0.2", default-features = false, features = ["xchacha20"]}
其他行为可以通过全局静态变量进行配置
pub struct Config {
pub is_ephemeral_key_compressed: bool,
pub is_hkdf_key_compressed: bool
}
在 is_ephemeral_key_compressed: true
的情况下,有效载荷将类似于:33 字节 + AES
,而不是 65 字节 + AES
。
在 is_hkdf_key_compressed: true
的情况下,HKDF密钥将从 ephemeral public key (compressed) + shared public key (compressed)
中导出,而不是从 ephemeral public key (uncompressed) + shared public key (uncompressed)
中导出。
use ecies::config::{Config, update_config};
update_config(Config {
is_ephemeral_key_compressed: true,
is_hkdf_key_compressed: true
});
为了兼容性,确保不同的应用程序共享相同的配置。通常配置只在初始化时更新一次,如果不是这样,请注意竞争条件。
安全性
为什么选择 AES-256-GCM 和 HKDF-SHA256
像 AES-256-GCM 这样的AEAD方案应该是您的首选对称加密方案,每个加密都有独特的IV。
对于两个非对称密钥之间的共享点上的密钥派生函数,HKDFs已被证明比简单的SHA256等哈希函数更安全。(参考)
为什么选择 XChaCha20-Poly1305 而不是 AES-256-GCM
XChaCha20-Poly1305 是 AES-256-GCM 的一个有竞争力的替代方案,因为它速度快,且不需要硬件加速(对缓存时序攻击具有抵抗力)。它还具有更长的nonce长度,可以减轻随机生成nonces时的生日攻击风险。
跨语言兼容性
所有功能都在以下不同语言之间相互检查:Python、Rust、JavaScript和Golang。
安全审计
以下依赖项已进行审计
基准测试
在2023年7月19日的MacBook Pro Mid 2015(15英寸,2.8 GHz 四核Intel Core i7)上。
AES后端(OpenSSL)
$ cargo bench --no-default-features --features openssl
encrypt 100M time: [100.21 ms 100.79 ms 101.80 ms]
encrypt 200M time: [377.84 ms 384.42 ms 390.58 ms]
Found 2 outliers among 10 measurements (20.00%)
2 (20.00%) high mild
decrypt 100M time: [52.430 ms 55.605 ms 60.900 ms]
Found 1 outliers among 10 measurements (10.00%)
1 (10.00%) high severe
decrypt 200M time: [157.87 ms 158.98 ms 160.01 ms]
Found 1 outliers among 10 measurements (10.00%)
1 (10.00%) high mild
AES后端(纯Rust)
$ export RUSTFLAGS="-Ctarget-cpu=sandybridge -Ctarget-feature=+aes,+sse2,+sse4.1,+ssse3"
$ cargo bench --no-default-features --features pure
encrypt 100M time: [196.63 ms 205.63 ms 222.25 ms]
Found 1 outliers among 10 measurements (10.00%)
1 (10.00%) high severe
Benchmarking encrypt 200M: Warming up for 3.0000 s
encrypt 200M time: [587.78 ms 590.71 ms 592.46 ms]
Found 1 outliers among 10 measurements (10.00%)
1 (10.00%) high mild
decrypt 100M time: [144.78 ms 145.54 ms 147.17 ms]
Found 1 outliers among 10 measurements (10.00%)
1 (10.00%) high mild
decrypt 200M time: [363.14 ms 364.48 ms 365.74 ms]
XChaCha20后端
$ cargo bench --no-default-features --features xchacha20
encrypt 100M time: [149.52 ms 150.06 ms 150.59 ms]
Found 1 outliers among 10 measurements (10.00%)
1 (10.00%) high mild
encrypt 200M time: [482.27 ms 484.95 ms 487.45 ms]
Found 3 outliers among 10 measurements (30.00%)
2 (20.00%) low severe
1 (10.00%) high severe
decrypt 100M time: [98.232 ms 100.37 ms 105.65 ms]
Found 1 outliers among 10 measurements (10.00%)
1 (10.00%) high severe
decrypt 200M time: [265.62 ms 268.02 ms 269.85 ms]
更新日志
请参阅 CHANGELOG.md。
依赖项
~5–11MB
~124K SLoC