使用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