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

Download history 851/week @ 2024-04-25 1099/week @ 2024-05-02 607/week @ 2024-05-09 794/week @ 2024-05-16 600/week @ 2024-05-23 689/week @ 2024-05-30 541/week @ 2024-06-06 641/week @ 2024-06-13 540/week @ 2024-06-20 507/week @ 2024-06-27 417/week @ 2024-07-04 503/week @ 2024-07-11 479/week @ 2024-07-18 805/week @ 2024-07-25 1417/week @ 2024-08-01 1625/week @ 2024-08-08

每月下载量4,410
20crate中使用(直接使用10个)

MIT许可证

39KB
584

eciesrs

Codacy Badge License CI Codecov Crates Doc

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"

aes-gcm支持自动CPU检测时,这将不再是必需的。

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