2 个版本
2.0.0-pre.2 | 2023年3月12日 |
---|
#1739 in 加密学
89KB
135 行
x25519-dalek
![](https://img.gs/czjpqfbdkz/full/https://travis-ci.org/dalek-cryptography/x25519-dalek.svg?branch=master)
纯 Rust 实现的 x25519 椭圆曲线 Diffie-Hellman 密钥交换,曲线运算由 curve25519-dalek 提供。
此软件包提供两个级别的 API:一个与 RFC7748 中指定的函数相匹配的裸字节面向的 x25519
函数,以及一个用于静态和临时 Diffie-Hellman 的高级别 Rust API。
示例
![](https://img.gs/czjpqfbdkz/full/https://raw.githubusercontent.com/dalek-cryptography/x25519-dalek/master/res/bubblesort-zines-secret-messages-cover.jpeg)
Alice 和 Bob 是两只可爱的小猫咪,它们丢失了手套,希望能够互相发送秘密消息来协调找到它们。否则——如果它们的照顾者猫咪发现了——它们肯定会被称为淘气的小猫咪,并且不会得到任何派!
但这两只小猫咪非常聪明。尽管它们的爪子仍然太大,而且其他部分有 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_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());
成功了!爱丽丝和鲍勃现在可以使用他们的共同密钥来加密他们的喵喵叫,例如,可以通过它来生成一个用于认证加密算法的密钥和nonce。
此示例使用了临时的DH API,这确保了密钥不能被重复使用;爱丽丝和鲍勃也可以使用静态DH API并加载一个长期密钥。
安装
要安装,请将以下内容添加到您的项目Cargo.toml
中
[dependencies]
x25519-dalek = "2.0.0-pre.0"
MSRV
当前MSRV为1.60。
文档
文档可在这里找到。
注意
此代码符合RFC7748测试向量。椭圆曲线运算由curve25519-dalek
提供,它尽力防止软件旁路攻击。
"秘密信息"封面和杂志版权©艾米·维博沃(@sailorhg)
另请参阅
- crypto_box:纯Rust公钥认证加密,与NaCl系列加密库(libsodium、TweetNaCl)兼容,使用
x25519-dalek
进行密钥协商
依赖项
~1.6–2.9MB
~62K SLoC