#密钥交换 #x25519 #Diffie-Hellman #curve25519 #密钥

无std x25519-dalek

使用 curve25519-dalek 的纯Rust实现的 X25519椭圆曲线Diffie-Hellman密钥交换

20个版本 (7个稳定版)

2.0.1 2024年2月7日
2.0.0 2023年8月12日
2.0.0-rc.32023年6月24日
2.0.0-rc.2 2023年3月31日
0.1.0 2017年10月24日

#170 in 加密学

Download history 209354/week @ 2024-04-20 177435/week @ 2024-04-27 182859/week @ 2024-05-04 210441/week @ 2024-05-11 217248/week @ 2024-05-18 223889/week @ 2024-05-25 217550/week @ 2024-06-01 199089/week @ 2024-06-08 205557/week @ 2024-06-15 195462/week @ 2024-06-22 166772/week @ 2024-06-29 173800/week @ 2024-07-06 189111/week @ 2024-07-13 204699/week @ 2024-07-20 188949/week @ 2024-07-27 197206/week @ 2024-08-03

每月813,726次下载
用于 1,108 个crate (185 个直接使用)

BSD-3-Clause

1.5MB
26K SLoC

x25519-dalek CI

这是一个纯Rust实现的X25519椭圆曲线Diffie-Hellman密钥交换,其中曲线操作由curve25519-dalek提供。

此crate提供两个级别的API:一个与RFC7748中指定的函数相匹配的裸字节导向的x25519函数,以及一个用于静态和临时Diffie-Hellman的高级Rust API。

示例

Alice和Bob是两只可爱的小猫咪,它们弄丢了它们的手套,他们希望能够相互发送秘密消息来协调找到它们,否则——如果他们的看护猫知道了——他们肯定会被叫作淘气的小猫咪,而且不会得到任何派!

但这两只小猫咪非常聪明。尽管它们的爪子仍然太大,其余部分还是90%的毛茸茸,但这些聪明的小猫咪一直在学习现代公钥加密学,并学会了一个巧妙的技巧,叫做椭圆曲线Diffie-Hellman密钥交换。通过正确的咒语,小猫咪将能够秘密地组织起来找到它们的手套,然后花剩下的下午时间吃一些美味的派!

Alice首先使用EphemeralSecret::random()然后使用PublicKey::from()来生成她的秘密和公钥

use x25519_dalek::{EphemeralSecret, PublicKey};

let alice_secret = EphemeralSecret::random();
let alice_public = PublicKey::from(&alice_secret);

鲍勃做的是一样的

# use x25519_dalek::{EphemeralSecret, PublicKey};
let bob_secret = EphemeralSecret::random();
let bob_public = PublicKey::from(&bob_secret);

爱丽丝在房间里喵喵叫,告诉alice_public给鲍勃,鲍勃大声地喵喵叫bob_public回应爱丽丝。现在爱丽丝通过以下方式计算与鲍勃的共享密钥:

# use rand_core::OsRng;
# use x25519_dalek::{EphemeralSecret, PublicKey};
# let alice_secret = EphemeralSecret::random_from_rng(OsRng);
# let alice_public = PublicKey::from(&alice_secret);
# let bob_secret = EphemeralSecret::random_from_rng(OsRng);
# let bob_public = PublicKey::from(&bob_secret);
let alice_shared_secret = alice_secret.diffie_hellman(&bob_public);

类似地,鲍勃通过以下方式计算共享密钥:

# use rand_core::OsRng;
# use x25519_dalek::{EphemeralSecret, PublicKey};
# let alice_secret = EphemeralSecret::random_from_rng(OsRng);
# let alice_public = PublicKey::from(&alice_secret);
# let bob_secret = EphemeralSecret::random_from_rng(OsRng);
# let bob_public = PublicKey::from(&bob_secret);
let bob_shared_secret = bob_secret.diffie_hellman(&alice_public);

这些密钥是相同的

# use rand_core::OsRng;
# use x25519_dalek::{EphemeralSecret, PublicKey};
# let alice_secret = EphemeralSecret::random_from_rng(OsRng);
# let alice_public = PublicKey::from(&alice_secret);
# let bob_secret = EphemeralSecret::random_from_rng(OsRng);
# let bob_public = PublicKey::from(&bob_secret);
# let alice_shared_secret = alice_secret.diffie_hellman(&bob_public);
# let bob_shared_secret = bob_secret.diffie_hellman(&alice_public);
assert_eq!(alice_shared_secret.as_bytes(), bob_shared_secret.as_bytes());

哇!现在爱丽丝和鲍勃可以使用他们的共享密钥来加密他们的喵喵叫,例如,通过使用它来生成一个用于认证加密密码的密钥和非对称数。

此示例使用了临时DH API,这确保了密钥无法重复使用;爱丽丝和鲍勃可以改用静态DH API并加载一个长期密钥。

安装

要安装,请将以下内容添加到您的项目Cargo.toml

[dependencies]
x25519-dalek = "2"

MSRV

当前MSRV是1.60。

文档

文档在此处可用:这里.

性能和后端选择

性能是正确性、安全性和清晰性之后的次要目标,但我们的目标是与其他实现具有竞争力。为此,我们允许用户选择他们的后端,即椭圆曲线和标量算术的底层实现。不同的后端有不同的用例。例如,如果您需要形式化验证的代码,则希望使用fiat后端(因为它是从Fiat Crypto生成的)。

有关后端的更多说明和详细信息,请参阅curve25519-dalek文档.

注意

此代码与RFC7748测试向量相匹配。椭圆曲线操作由curve25519-dalek提供,它尽力防止软件旁路攻击。

"秘密信息"封面和杂志版权©艾米·维博沃(@sailorhg)

另请参阅

  • crypto_box:与NaCl系列加密库(libsodium、TweetNaCl)兼容的纯Rust公钥认证加密,它使用x25519-dalek进行密钥协商

依赖关系

~0.4–1.6MB
~33K SLoC