#ratchet #double #key #key-management #public-key #forward-secrecy #future-secrecy

double-ratchet

在两个当事人之间交换加密消息的Double Ratchet密钥管理

1个不稳定版本

0.1.0 2019年3月8日

#1242 in 密码学


用于 double-ratchet-signal

BSD-3-Clause

52KB
739

Double Ratchet

Double Ratchet的纯Rust实现,由Trevor Perrin和Moxie Marlinspike指定。

Double Ratchet允许两个用户安全通信:它为其用户提供一个机密认证的通道,包括前向机密性未来机密性。初始化共享密钥和认证公钥后,Double Ratchet将自动处理支持此通道所需的所有密钥管理,包括处理顺序错误的到达的消息。

Double Ratchet本身需要能够执行Diffie-Hellman (DH)操作、提供带关联数据的认证加密 (AEAD)的密钥系统以及两个密钥派生函数 (KDF)。此crate旨在对这些函数的实现保持中立:crate的用户实现CryptoProvider特质,而DoubleRatchet结构应该负责其余部分。[^1]

[^1]: 但如果您有需要该接口不足以满足的场景,请与我联系,我将看看是否能满足您的需求。

示例

以下示例对应于Double Ratchet在Signal协议中的使用方式。有关实现的更多详细信息,请参阅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")
);

安装

Double Ratchet crate通过crates.io分发:通过将以下内容添加到您的Cargo.toml中安装它

[dependencies]
double-ratchet = "0.1"

文档

文档可在此处找到。

未来计划

这甚至不是我的最终形态!我打算添加至少以下功能,并欢迎更多建议。

  • Double Ratchet的头部加密变体
  • 泛化KeyStore以允许自动删除非常旧的密钥
  • 提供一种将 DoubleRatchet 保存/恢复到存储的方法

依赖项

~64KB