#elliptic-curve #密钥交换 #迪菲-赫尔曼 #x25519 #curve25519

无std x25519-dalek

基于x25519-dalek进行分支,更新rand_core

2个稳定版本

1.1.1 2021年2月19日

#1214加密学

Download history 351/week @ 2024-03-13 607/week @ 2024-03-20 643/week @ 2024-03-27 973/week @ 2024-04-03 899/week @ 2024-04-10 1176/week @ 2024-04-17 839/week @ 2024-04-24 408/week @ 2024-05-01 473/week @ 2024-05-08 596/week @ 2024-05-15 604/week @ 2024-05-22 631/week @ 2024-05-29 652/week @ 2024-06-05 828/week @ 2024-06-12 468/week @ 2024-06-19 885/week @ 2024-06-26

2,941 每月下载量
用于 6 个crates (3 个直接)

BSD-3-Clause

85KB
268

x25519-dalek

一个纯Rust实现的x25519椭圆曲线迪菲-赫尔曼密钥交换,曲线操作由curve25519-dalek提供。

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

示例

爱丽丝和鲍勃是两只可爱的小猫咪,它们失去了手套,希望能互相发送秘密消息以协调找到它们。否则——如果它们的照顾猫知道了——它们肯定会被称为淘气的小猫咪,然后什么甜点都不会有!

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

首先,爱丽丝使用EphemeralSecret::new()然后PublicKey::from()来生成她的秘密和公钥

use rand_core::OsRng;
use x25519_dalek::{EphemeralSecret, PublicKey};

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

鲍勃也做了同样的事情

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

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

# use rand_core::OsRng;
# use x25519_dalek::{EphemeralSecret, PublicKey};
# let alice_secret = EphemeralSecret::new(OsRng);
# let alice_public = PublicKey::from(&alice_secret);
# let bob_secret = EphemeralSecret::new(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::new(OsRng);
# let alice_public = PublicKey::from(&alice_secret);
# let bob_secret = EphemeralSecret::new(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::new(OsRng);
# let alice_public = PublicKey::from(&alice_secret);
# let bob_secret = EphemeralSecret::new(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 = "1.1"

文档

文档可在这里找到。

注意

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

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

另请参阅

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

依赖项

~2–2.8MB
~61K SLoC