使用OpenSSL实现X25519秘钥协商功能

首先大体了解下X5519曲线算法和ECC椭圆曲线算法,ECC是Elliptic curve cryptography(椭圆曲线密码学)的缩写,严格的讲X25519算法也是椭圆曲线算法的一种,但是和其他椭圆曲线算法不兼容(如secp256k1/secp354r1/secp521k1/prime256v1),所以OpenSSL最新版本虽然支持ECC算法,但是用法和其他椭圆曲线算法不同,相关情况可以参考:

问题在于我们使用时需要拿到X25519公钥和私钥的unsigned char*类型数据,但是OpenSSL在生成密钥对和派生共享密钥时都是用使用EVP_PKEY类型,对于一般的椭圆曲线算法,我们可以使用i2d_PublicKey/d21_PublicKey/i2d_PrivateKey/d21_PrivateKey进行两种类型的转换:

但是结合如下链接以及查看OpenSSL源码,发现这四个方法根本不适用EVP_PKEY_X25519类型,调用时直接返回-1。

从以下链接中可以获取一些OpenSSL常用的转换策略,但是仍然不适用于X25519:

后来发现Stack Overflow的相关提问涉及到了ecx_get_priv_key/ecx_get_pub_key两个函数,但是这两个函数都是internal的,并没有暴露给开发者,所以这条路也走不通

最后翻了下OpenSSL的Github issues,发现不少人遇到了这个问题:

从大家的讨论中发现OpenSSL的commiter在1.1.1版本提供了EVP_PKEY_get_raw_private_key和EVP_PKEY_get_raw_public_key,经验证可以使用:

posted @ 2020-04-01 20:26  Aloys_Code  阅读(3986)  评论(0编辑  收藏  举报
我的GITHUB|