使用OpenSSL實現X25519秘鑰協商功能

2022-01-10 07:38:31 字數 721 閱讀 2408

首先大體了解下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。

後來發現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,經驗證可以使用:

使用openssl實現非對稱加密

使用 openssl 實現非對稱加密 since 2015 11 10 header content type text html charset utf 8 classrsa this keypath path 建立公鑰和私鑰 public functioncreatekey 設定私鑰 publi...

PHP使用OpenSSL實現AES加密的筆記

記錄這兩天遇到的一些問題,一開始主要是對一些概念理解的不清楚 比如aes是一種演算法,而openssl是乙個擴充套件庫,其中包含對aes演算法的實現 當然在完全理解演算法後可以自己實現,但可能會遇到很多問題,我會在以後進行嘗試 目前在專案的使用中,還是使用擴充套件庫的方法最快最簡單 1,加密方法 通...

php使用openssl來實現非對稱加密

使用非對稱加密主要是借助openssl的公鑰和私鑰,用公鑰加密私鑰解密,或者私鑰加密公鑰解密。1.安裝openssl和php的openssl擴充套件 2.生成私鑰 openssl genrsa 用於生成rsa私鑰檔案,生成是可以指定私鑰長度和密碼保護 plain view plain copy op...