问题描述
我正在尝试了解如何使用 nettle 的 curve25519 函数实现密钥交换。 我正在编写一个软件,它使用基于公钥的身份验证建立加密的 TCP 连接。客户端和服务器程序共享相同的代码库。
这是一个学习网络和加密编程的业余爱好项目。 :-)
我有使用 nettle 的 rsa_encrypt 函数的玩具应用程序,但从我所见,没有与 curve25519 等效的应用程序。如何使用nettle的curve25519函数进行密钥交换?
需要明确的是,我知道我可以而且可能应该简单地使用任何生产质量的 TLS 库,如 openssl,但我想学习如何从头开始进行加密的 TCP 连接。使用 TLS 库会破坏这个目的。 我比较了许多加密库,发现 nettle 是最容易上手的,因为它级别低。
解决方法
椭圆曲线通常用于关键的“协议”而不是关键的“交换”。
我不知道您对此了解多少,所以我将简要解释一下:
-
RSA - 我们生成一个随机对称密钥,用接收者的公钥对其进行加密,然后接收者自己解密并使用它。
-
ECC (Elliptic curve crypto)——我们使用了一个叫做 Elliptic Curve Diffie-Hellman 的过程,由于曲线点乘法的交换性质,我们可以通过乘以 {{1 }},其中
theirPublicKeyPoint * ourPrivateKeyPoint * G
是曲线基点。
所以,总结一下:
- 我强烈建议您使用 ECDH 而不是 RSA。
- 需要找到一个函数在
G
上执行ECDH,也称为curve25519
,nettle的函数是this。 - 在 ECDH 过程之后,我们最终得到了曲线上的另一个点。 :) - 我们散列
x25519
坐标以生成对称密钥。尽管这通常由库完成。