c++ - 荨麻曲线25519密钥交换
问题描述
我试图了解如何使用 nettle 的 curve25519 函数实现密钥交换。我正在编写一个使用基于公钥的身份验证建立加密 TCP 连接的软件。客户端和服务器程序共享相同的代码库。
这是一个学习网络和加密编程的爱好项目。:-)
我有使用 nettle 的 rsa_encrypt 函数的玩具应用程序,但从我所看到的来看,没有与 curve25519 等效的东西。如何使用 nettle 的 curve25519 函数进行密钥交换?
需要明确的是,我知道我可以并且可能应该简单地使用任何生产质量的 TLS 库,如 openssl,但我想学习如何从头开始进行加密的 TCP 连接。使用 TLS 库会破坏该目的。我比较了许多加密库,发现荨麻是最容易接近的,因为它是低级的。
解决方案
椭圆曲线通常用于关键“协议”而不是关键“交换”。
不知道大家对此了解多少,我简单解释一下:
RSA - 我们生成一个随机对称密钥,用接收者的公钥对其进行加密,然后接收者自己解密并使用它。
ECC(Elliptic curve crypto)——我们使用了一个叫做Elliptic Curve Diffie-Hellman的过程,由于曲线点乘法的交换性质,我们可以通过乘法在曲线上建立相同的点
theirPublicKeyPoint * ourPrivateKeyPoint * G
,其中G
是曲线的基点。
所以,总结一下:
- 我非常鼓励您使用 ECDH 而不是 RSA。
- 你需要找到一个函数来执行ECDH over
curve25519
,也称为x25519
nettle的函数是this。 - 在 ECDH 的过程之后,我们最终得到了曲线上的另一个点。
x
:) - 我们对其坐标进行散列以生成对称密钥。虽然这通常由 lib 完成。
推荐阅读
- python - 如何使用 pydoc 仅查看文档文本
- spring - Communication between user-service and auth-service in microservice architecture
- android - 科尔多瓦谷歌加插件和谷歌地图不能一起工作
- node.js - 将图像从 mysql 服务器发送到节点 js 模板
- javascript - 在视口中可见时视频不播放?
- angular - 访问从 HTTP Observable 返回的数据
- javascript - 在 ReactJS 中实现动态表单
- javascript - 使用 C# 对 Gridview 表进行排序
- linux - spring-boot spring.resources.static-locations:带有 linux 的远程 uri
- c++ - 如何将结构成员映射到字符串?