首页 > 解决方案 > 荨麻曲线25519密钥交换

问题描述

我试图了解如何使用 nettle 的 curve25519 函数实现密钥交换。我正在编写一个使用基于公钥的身份验证建立加密 TCP 连接的软件。客户端和服务器程序共享相同的代码库。

这是一个学习网络和加密编程的爱好项目。:-)

我有使用 nettle 的 rsa_encrypt 函数的玩具应用程序,但从我所看到的来看,没有与 curve25519 等效的东西。如何使用 nettle 的 curve25519 函数进行密钥交换?

需要明确的是,我知道我可以并且可能应该简单地使用任何生产质量的 TLS 库,如 openssl,但我想学习如何从头开始进行加密的 TCP 连接。使用 TLS 库会破坏该目的。我比较了许多加密库,发现荨麻是最容易接近的,因为它是低级的。

标签: c++networkingtcpcryptographynettle

解决方案


椭圆曲线通常用于关键“协议”而不是关键“交换”。

不知道大家对此了解多少,我简单解释一下:

  • RSA - 我们生成一个随机对称密钥,用接收者的公钥对其进行加密,然后接收者自己解密并使用它。

  • ECC(Elliptic curve crypto)——我们使用了一个叫做Elliptic Curve Diffie-Hellman的过程,由于曲线点乘法的交换性质,我们可以通过乘法在曲线上建立相同的点theirPublicKeyPoint * ourPrivateKeyPoint * G,其中G是曲线的基点。

所以,总结一下:

  • 我非常鼓励您使用 ECDH 而不是 RSA。
  • 你需要找到一个函数来执行ECDH over curve25519,也称为x25519nettle的函数是this
  • 在 ECDH 的过程之后,我们最终得到了曲线上的另一个点。x:) - 我们对其坐标进行散列以生成对称密钥。虽然这通常由 lib 完成。

推荐阅读