使用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,经验证可以使用:


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM