#密钥交换 #椭圆曲线 #x25519 #迪菲-赫尔曼 #curve25519 #后端

无 std x25519-dalek-fiat

使用 curve25519-dalek 实现的纯 Rust X25519 椭圆曲线迪菲-赫尔曼密钥交换

1 个不稳定版本

0.1.0 2021年2月16日

#1872 in 密码学

Download history 627/week @ 2024-03-13 457/week @ 2024-03-20 390/week @ 2024-03-27 462/week @ 2024-04-03 1074/week @ 2024-04-10 1488/week @ 2024-04-17 1501/week @ 2024-04-24 1359/week @ 2024-05-01 453/week @ 2024-05-08 866/week @ 2024-05-15 876/week @ 2024-05-22 504/week @ 2024-05-29 538/week @ 2024-06-05 481/week @ 2024-06-12 348/week @ 2024-06-19 731/week @ 2024-06-26

每月 2,239 次下载
12 包(直接 3 个)中使用

BSD-3-Clause

85KB
267 代码行

x25519-dalek

A pure-Rust implementation of x25519 elliptic curve Diffie-Hellman key exchange, with curve operations provided by curve25519-dalek.

关于

这是 x25519-dalek 项目的轻量级分支,其主要区别在于将原始的 curve25519-dalek 依赖替换为 curve25519-dalek-fiat. 这允许使用由 fiat-crypto 项目提供的正式验证后端,其中曲线操作是从 Coq 证明的算术正确性中提取出来的。

此软件包提供两个级别的 API:一个匹配 RFC7748 中指定的字节数据的 x25519 函数,以及一个用于静态和临时迪菲-赫尔曼的高层 Rust API。

示例

爱丽丝和鲍勃是两只可爱的猫咪,它们弄丢了它们的围巾,希望能够互相发送秘密信息来协调寻找它们,否则——如果它们的看护猫发现了——它们肯定会被称为淘气的猫咪,并且不会得到任何蛋糕!

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

首先,Alice使用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);

Bob做的是同样的操作

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

Alice在房间里喵喵叫,告诉Bob她的alice_public,Bob则大声地回以bob_public。Alice现在通过以下方式计算与Bob的共享秘密:

# 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);

同样,Bob通过以下方式计算共享秘密:

# 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());

哇!Alice和Bob现在可以使用他们的共享秘密来加密他们的喵喵叫声,例如,通过用它来生成一个用于认证加密密码的密钥和nonce。

此示例使用了临时的DH API,这确保了秘密密钥不能被重用;Alice和Bob也可以使用静态DH API并加载一个长期秘密密钥。

安装

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

[dependencies]
x25519-dalek = "1.1"

文档

文档可在此处找到。

注意

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

"秘密信息"封面图片和杂志版权© Amy Wibowo (@sailorhg)

另请参阅

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

依赖关系

~1.8–3MB
~70K SLoC