用Openssl計算ECDSA簽名


ECDSA的全名是Elliptic Curve DSA,即橢圓曲線DSA。它是Digital Signature Algorithm (DSA)應用了橢圓曲線加密算法的變種。橢圓曲線算法的原理很復雜,但是具有很好的公開密鑰算法特性,通過公鑰無法逆向獲得私鑰。
 
第一部分 : DSA的簽名和驗證過程
 
要了解ECDSA,首先要了解DSA簽名的過程和驗證過程。為了理解的方便,這里省去諸多DSA算法的細節,僅就重要的幾個點進行討論。
 
1. 簽名過程
    假設要簽名的消息是一個字符串:“Hello World!”。DSA簽名的第一個步驟是對待簽名的消息生成一個消息摘要。不同的簽名算法使用不同的消息摘要算法。比如,DSS使用SHA1來生成160比特的摘要,而ECDSA256使用SHA256生成256比特的摘要。
    摘要生成結束后,應用簽名算法對摘要進行簽名:
 
  1. 產生一個隨機數k
  2. 利用隨機數k,計算出兩個大數r和s。將r和s拼在一起就構成了對消息摘要的簽名。
    這里需要注意的是,因為隨機數k的存在,對於同一條消息,使用同一個算法,產生的簽名是不一樣的。從函數的角度來理解,簽名函數對同樣的輸入會產生不同的輸出。因為函數內部會將隨機值混入簽名的過程。
 
2. 驗證過程
    關於驗證過程,這里不討論它的算法細節。從宏觀上看,消息的接收方從簽名中分離出r和s,然后利用公開的密鑰信息和s計算出r。如果計算出的r和接收到的r值相同,則表示驗證成功。否則,表示驗證失敗。
 
第二部分 : 用Openssl來實現ECDSA簽名
 
Openssl實現了ECDSA算法,並預定義好了各個橢圓曲線的參數。以下以RFC4745中定義的ECDSA256為例,詳述用Openssl實現ECDSA簽名的過程。關於ECDSA算法的各種數據結構的意義和接口的使用方法,可以參考Openssl的官方文檔。
 
第一步 - 計算消息摘要
Openssl的上層接口EVP提供了計算消息摘要和簽名各種借口,前提是必須有預定義好的EVP_MD。對於ECDSA算法,Openssl預定義好了一個EVP_ecdsa結構,其中定義的消息摘要算法是SHA1,並不是我們需要的SHA256。因此,不能直接使用EVP_DigestSignFinal()接口一步生成簽名,需要分開計算摘要和簽名。
 
代碼如下:
 
 
第二步 - 計算對摘要的簽名
ECDSA簽名算法是一個確定的算法。不同的橢圓曲線只有參數上的不同。所以,算出正確簽名的前提是設置正確的參數。ECDSA簽名的輸入參數有:待簽名的數字摘要,數字摘要的長度,密鑰EC_KEY。
 
密鑰可以來自於私鑰文件,也可以隨機生成。如果隨機生成,則代碼如下:
 
 
這里,首先通過橢圓曲線的標識符NID_X9_62_prime256v1生成一個EC_KEY。通過這種方式生成的EC_KEY里已經包含了橢圓曲線的參數。否則,需要手動設置EC_GROUP。然后調用EC_KEY_generate_key來生成私鑰和公鑰。
 
ECDSA_do_sign的返回值是一個包含了r和s的數據結構。可以調用i2d_ECDSA_SIG函數將其編碼成DER結構。但是IPSec的payload中傳輸的是(r,s)的聯合,所以需要將這兩個BIGNUM轉換成二進制比特流。
 
前面提到,密鑰可以來自於私鑰文件。如果密鑰來自於私鑰文件,可以首先調用PEM的相關函數,生成EVP_PKEY,然后調用EVP_PKEY_get1_EC_KEY函數從EVP_PKEY中取得EC_KEY。需要注意的是,從EVP_PKEY中取得的EC_KEY可能沒有設置橢圓曲線參數EC_GROUP。所以,或者手動設置EC_GROUP,或者創建一個新的EC_KEY,然后調用EC_KEY_set_private_key和EC_KEY_set_public_key函數將私鑰和公鑰設置進來。
 
第三部分 : 其他
 
如果只知道私鑰和所使用橢圓曲線,可以通過EC_POINT_mul函數生成公鑰。第一個參數是EC_GROUP,第二個參數保存生成的公鑰,第三個參數是私鑰,其他參數忽略。
 


更新(2017.02.08):
1. 有些朋友來信希望能看一下文中相關源碼,由於作成此文時的代碼早已丟失,之后幾年很少再做Openssl相關的開發,於是也沒有重寫代碼。最近在閱讀Openssl最新源碼時發現,其自帶的測試文檔就是最好的示例。請下載最新的Openssl源碼並解壓,test/ecdsatest.c就是最好的例子。本文中涉及的所有代碼均可從ecdsatest.c中找到對照之處,大部分在函數x9_62_test_internal中。
2. 如有其他相關問題,可以郵件聯系jiangwlee@163.com
 
轉自:
http://blog.csdn.net/jiangwlee/article/details/11817579


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM