#密钥管理 #加密密钥 #双摇杆 #端到端加密 #加密 #前向安全 #未来安全

无需 std double-ratchet-signal

重新导出双摇杆信号提供者:在两个当事人之间交换加密消息的双摇杆密钥管理

1 个不稳定版本

0.1.3 2024 年 2 月 6 日

#2251加密学

BSD-3-Clause

23KB
290

关于重新分发

重新导出 double-ratchet 项目的信号提供者:在两个当事人之间交换加密消息的双摇杆密钥管理

修改版权 (C) myl7

修改 SPDX-License-Identifier: BSD-3-Clause

以下是原始的说明文件


双摇杆

双摇杆的纯 Rust 实现,由 Trevor Perrin 和 Moxie Marlinspike 在 此处 指定。

双摇杆允许两个用户安全地通信:它为其用户提供了一个 保密验证 的通道,包括 前向安全未来安全。初始化共享密钥和验证过的公钥后,双摇杆将自动处理支持此通道所需的所有密钥管理,包括处理乱序到达的消息的解密。

双摇杆本身需要一个可以执行 Diffie-Hellman (DH) 操作的公钥加密系统,一个提供 带有关联数据的验证加密 (AEAD) 和两个 密钥派生函数 (KDF) 的私钥加密系统。这个 crate 旨在对这些函数的实现保持无偏见:crate 的用户实现 CryptoProvider 特性和 DoubleRatchet 结构体,应该负责其余部分(但如果接口不足以满足您的用例,请与我联系,我会看看是否能满足您的需求)。

示例

以下示例对应于双摇杆在 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"

默认情况下已启用 std 功能。如果您不想使用 std,请使用 --no-default-features 编译。

文档

文档可在此处获得:这里

未来计划

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

  • 双摇杆加密变体
  • KeyStore 通用化以允许自动删除非常旧的关键字
  • 提供保存/恢复 DoubleRatchet 到存储的方法
  • 提供加密/解密的非分配接口

依赖关系

~3MB
~55K SLoC