荨麻曲线25519密钥交换

nettle curve25519 key exchange

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

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

我有一个使用 nettle 的 rsa_encrypt 函数的玩具应用程序,但据我所知,没有与 curve25519 等效的应用程序。如何使用 nettle 的 curve25519 函数进行密钥交换?

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

椭圆曲线一般用于键'agreement'而不是键'exchange'。

不知道大家对这方面了解多少,简单说明一下:

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

  • ECC(椭圆曲线加密)——我们使用称为椭圆曲线 Diffie-Hellman 的过程,由于曲线点相乘的可交换性,我们可以通过以下方式在曲线上建立相同的点乘以 theirPublicKeyPoint * ourPrivateKeyPoint * G,其中 G 是曲线基点。

所以,总结一下:

  • 我强烈建议您使用 ECDH 而不是 RSA。
  • 你需要找到一个函数在curve25519上执行ECDH,也称为x25519,nettle的函数是this
  • 经过 ECDH 处理后,我们在曲线上得到了另一个点。 :) - 我们对 x 的坐标进行哈希处理以生成对称密钥。尽管这通常由 lib 完成。