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在 密码学
每月909次下载
用于 vru-noise
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_hellman
和as_diffie_hellman
上使用两种方法来实现该示例。选择此API的原因是代码重复较少,因为只有一个结构体。此外,此API还实现了编译时保证,如果用户想将密钥视为临时密钥,则它只会被使用一次。此API的一个缺点是Secrets之间的区别不明显。例如,作为API的消费者,表明我希望接受的是EphemeralSecret
类型将是有益的,因为这降低了阅读复杂性,因为类型编码了它只能在一个diffie-hellman密钥交换中使用一次的事实。
依赖关系
~355KB