國密算法SM2證書製作

原文鏈接:http://www.jonllen.com/jonllen/work/162.aspx

國密算法SM2證書製作

分類:工作

前段時間將系統的RSA算法全部升級爲SM2國密算法,密碼機和UKey硬件設備大都同時支持RSA和SM2算法,只是應用系統的加解密簽名驗證需要修改,這個更改底層調用的加密動態庫來,原來RSA用的對稱加密算法DES(AES)和摘要MD5(SHA1)也相應改變,分別對應SM1、SM3算法,SM1算法基於硬件實現,SM2、SM3算法已公開。

SM2簽名驗證算法

SM2簽名同樣也是需要先摘要原文數據,即先使用SM3密碼雜湊算法計算出32byte摘要。SM3需要摘要簽名方ID(默認1234567812345678)、曲線參數a,b,Gx,Gy、共鑰座標(x,y)計算出Z值,然後再雜湊原文得出摘要數據。這個地方要注意曲線參數和座標點都是32byte,在轉換爲BigInteger大數計算轉成字節流時要去掉空補位,否則可能會出現摘要計算不正確的問題。SM2簽名實現如下:

SM2簽名

SM2算法是基於ECC算法的,簽名同樣返回2個大數,共64byte。由於原來RSA算法已很普遍支持,要實現RSA的簽名驗籤都有標準庫的實現,而SM2是國密算法在國際上還沒有標準通用,算法Oid標識在X509標準中是沒定義的。在.Net或Java中可以基於使用BouncyCastle加密庫實現,開源的也比較好學習擴展。SM2算法驗籤可以使用軟驗籤,即可以不需要使用硬件設備,同樣使用原始數據、簽名、證書(公鑰)來實現對簽名方驗證,保證數據完整性未被篡改。驗證過程同樣需先摘要原文數據,公鑰在證書中是以一個66byte的BitString,去掉前面標記位即64byte爲共鑰座標(x,y),中間分割截取再以Hex方式轉成BigInteger大數計算,驗籤代碼如下:

SM2驗籤

製作SM2證書

基於BouncyCastle開源庫,可以輕鬆製作X509證書、CRL、pkcs10、pkcs12,支持國際通用的RSA、ECC算法。製作SM2證書可以通過擴展BouncyCastle庫來實現,需加入SM2簽名算法DerObjectIdentifier標識1.2.156.10197.1.501(基於SM3的SM2算法簽名),密鑰對的生成使用國密推薦曲線參數,然後如上所示自行實現SM2簽名驗證算法。X509證書由證書主體、證書籤名算法標識、簽名組成,和RSA證書主要不同的是SM2證書的簽名算法標識和簽名,及證書公鑰使用ECKeyParameters。生成自簽名SM2證書代碼如下:

SM2證書生成

X509證書使用ASN1語法進行編碼,是用類型標識、長度和值序列來描述數據結構的。SM2證書在製作設置公鑰時,默認會帶ECKeyParameters參數,並沒有SM2的公鑰參數1.2.156.10197.1.301,因此需要自己寫個SM2橢圓曲線密碼算法標識對象,這樣在生成的證書中就可以看到公鑰參數字段,如下所示:

SM2證書公鑰標識

SM2算法是國密局公佈的公鑰密碼算法,在相當強度下密鑰比RSA短,在使用智能卡有限空間存儲時非常可貴。目前國內很多CA大都升級支持SM2算法證書,相信以後會慢慢地推廣更多應用,也期望之後能與國際標準接軌。

附:

國密推薦256位曲線參數

  • p=FFFFFFFE FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF 00000000 FFFFFFFF FFFFFFFF
  • a=FFFFFFFE FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF 00000000 FFFFFFFF FFFFFFFC
  • b=28E9FA9E 9D9F5E34 4D5A9E4B CF6509A7 F39789F5 15AB8F92 DDBCBD41 4D940E93
  • n=FFFFFFFE FFFFFFFF FFFFFFFF FFFFFFFF 7203DF6B 21C6052B 53BBF409 39D54123
  • Gx=32C4AE2C 1F198119 5F990446 6A39C994 8FE30BBF F2660BE1 715A4589 334C74C7
  • Gy=BC3736A2 F4F6779C 59BDCEE3 6B692153 D0A9877C C62A4740 02DF32E5 2139F0A0

SM2國密算法測試示例

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章