荨麻曲线25519密钥交换

问题描述

我正在尝试了解如何使用 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 坐标以生成对称密钥。尽管这通常由库完成。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...