8个版本 (5个重大变更)

0.6.0 2020年6月2日
0.5.0 2020年6月2日
0.4.1 2020年6月2日
0.3.0 2020年6月2日
0.1.1 2020年5月30日

#1993密码学

Download history 301/week @ 2024-03-14 246/week @ 2024-03-21 270/week @ 2024-03-28 191/week @ 2024-04-04 177/week @ 2024-04-11 198/week @ 2024-04-18 149/week @ 2024-04-25 189/week @ 2024-05-02 268/week @ 2024-05-09 198/week @ 2024-05-16 187/week @ 2024-05-23 174/week @ 2024-05-30 262/week @ 2024-06-06 248/week @ 2024-06-13 197/week @ 2024-06-20 173/week @ 2024-06-27

每月909次下载
用于 vru-noise

BSD-3-Clause

20KB
297

X448

这是Diffie-hellman密钥交换协议X448的纯Rust实现。

示例

在下面的示例中,Alice有一个临时的(一次性使用的)密钥,而Bob有一个静态的(多次使用的)密钥。

设置阶段

在这个阶段,双方生成一个密钥并将相应的公钥发送给对方。

Alice

  • Alice使用随机数生成一个新的临时密钥。
  • Alice将其公钥发送给Bob,以便Bob可以计算共享密钥。
        let alice_secret = Secret::new(&mut OsRng);
        let alice_public_key = PublicKey::from(&alice_secret);

Bob

  • Bob从其存储中加载一个密钥。
  • Bob将其公钥发送给Alice,以便Alice可以计算共享密钥。
        let bob_secret = Secret::from_bytes(bytes_of_key);
        let bob_public_key = PublicKey::from(&bob_secret);

密钥交换阶段

现在双方都有了足够的信息来计算共享密钥。他们现在独立计算共享密钥。

Alice

    let alices_shared_secret = alice_secret.to_diffie_hellman(&bob_public_key);

Bob

    let bobs_shared_secret = bob_secret.as_diffie_hellman(&alice_public_key);

就是这样。有点。

  • 如果Alice或Bob都没有使用低阶点,那么他们将拥有相同的共享密钥。如果一方确实设法绕过API,而诚实的一方试图在Diffie-hellman密钥交换中使用这个低阶点,共享密钥将返回None。

  • 请注意,Alice使用了名为 to_diffie_hellman 的方法,而Bob使用了名为 as_diffie_hellman 的方法。使用 to_diffie_hellman 将消耗密钥,表示该密钥只能在Diffie-Hellman密钥交换中使用一次。当然,您可以在消耗之前复制它,但那样使用 as_diffie_hellman 会更有效率。

API讨论

API公开了3个结构;公钥、共享密钥和密钥。

  • 公钥是一个椭圆曲线点。它对应于用户拥有的标量。
  • 密钥是一个标量。这个标量对应于用户的公钥和RFC中指定的生成器。
  • 共享密钥是一个椭圆曲线点。它是Diffie-hellman密钥交换算法中双方计算出的密钥。

与X25519-Dalek的不同之处

在我们的API中只有一个密钥标量。在X25519-Dalek中,有两种类型的密钥标量;

  • 一个临时的密钥标量,它只能在Diffie-Hellman密钥交换中使用一次。
  • 一个静态的密钥标量,它可以在Diffie-hellman密钥交换中多次使用。

以下示例中,此API通过在相同的结构体to_diffie_hellmanas_diffie_hellman上使用两种方法来实现该示例。选择此API的原因是代码重复较少,因为只有一个结构体。此外,此API还实现了编译时保证,如果用户想将密钥视为临时密钥,则它只会被使用一次。此API的一个缺点是Secrets之间的区别不明显。例如,作为API的消费者,表明我希望接受的是EphemeralSecret类型将是有益的,因为这降低了阅读复杂性,因为类型编码了它只能在一个diffie-hellman密钥交换中使用一次的事实。

依赖关系

~355KB