1个不稳定版本
0.1.1 | 2024年2月6日 |
---|
#1334在 密码学
3KB
关于再分发
重新导出double-ratchet项目的Signal提供者:用于两个实体之间交换加密消息的双摇杆密钥管理
修改版权(C)myl7
修改SPDX-License-Identifier: BSD-3-Clause
以下为原始readme
双摇杆
一个纯Rust实现的Double Ratchet,如Trevor Perrin和Moxie Marlinspike所述。
双摇杆允许两个用户安全通信:它为用户提供了一个机密和验证的通道,包括前向机密性和未来机密性。在用共享密钥和认证公钥初始化后,双摇杆将自动处理支持此通道所需的所有密钥管理,包括处理接收到的顺序错误的消息。
双摇杆本身需要一个可以执行Diffie-Hellman(DH)操作的公钥加密系统,一个提供带关联数据的认证加密(AEAD)的密钥加密系统,以及两个密钥派生函数(KDF)。这个crate旨在对这些函数的实现保持中立:crate的用户实现CryptoProvider
特质,而DoubleRatchet
结构应该处理其余部分(但如果你有接口不足的使用案例,请联系我,我将看看是否可以适应)。
示例
以下示例对应于在Signal协议中使用的Double Ratchet的方式。有关实现细节,请参阅tests/signal.rs
,它还提供了SignalCryptoProvider
。我们假设Alice和Bob共享一个密钥SK
,并且Alice知道Bob的公钥。
use double_ratchet::{DoubleRatchet};
use rand_os::RandOs;
let mut rng = OsRng::new().unwrap();
type DR = DoubleRatchet<SignalCryptoProvider>;
// Alice intializes and sends the first message
let mut alice = DR::new_alice(&SK, bobs_public_prekey, None, &mut rng);
let pt0 = b"Hello Bob";
let (h0, ct0) = alice.ratchet_encrypt(pt0, b"A2B", &mut rng);
// Bob initializes and receives the first message
let mut bob = DR::new_bob(&SK, bobs_prekey_pair, None);
assert_eq!(
Ok(Vec::from(&pt0[..])),
bob.ratchet_decrypt(&h0, &ct0, b"A2B")
);
// After receiving the first message, Bob can send his replies
let pt1 = b"Hi Alice";
let (h1, ct1) = alice.ratchet_encrypt(pt1, b"B2A", &mut rng);
let pt2 = b"How are you?";
let (h2, ct2) = bob.ratchet_encrypt(pt2, b"B2A", &mut rng);
assert_eq!(
Ok(Vec::from(&pt_b_0[..])),
alice.ratchet_decrypt(&h_b_0, &ct_b_0, b"B2A")
);
// Note that Alice has not yet received Bob's first message...
let pt3 = b"Good and you?";
let (h3, ct3) = alice.ratchet_encrypt(pt3, b"A2B", &mut rng);
assert_eq!(
Ok(Vec::from(&pt3[..])),
bob.ratchet_decrypt(&h3, &ct3, b"A2B")
);
// ...but when she does get it she will be able to decrypt
assert_eq!(
Ok(Vec::from(&pt1[..])),
alice.ratchet_decrypt(&h1, &ct1, b"B2A")
);
安装
双摇杆库通过 crates.io 分发:通过在您的 Cargo.toml
中添加以下内容来安装它
[dependencies]
double-ratchet = "0.1"
std
功能默认启用。如果您不想使用 std
,请使用 --no-default-features
进行编译。
文档
文档可在 此处 获取。
未来计划
这甚至不是我的最终形式!我打算添加至少以下功能,并欢迎更多功能的建议。
- 双摇杆的头部加密变体
- 将
KeyStore
泛化以允许自动删除非常旧的关键字 - 提供保存/恢复
DoubleRatchet
到存储的方式 - 提供加密/解密的非分配接口
依赖项
~615KB
~14K SLoC