華嬌 王婭男
摘要:在國家已經(jīng)大力推行性能更優(yōu)更安全的SM2公鑰密碼算法的背景下,基于國密算法的證書也將越來越廣泛地被采用,則證書的合法性需要驗證,因此本文主要研究了如何驗證SM2證書的簽名值。通過研究SM2證書的結構,獲取簽名原文數(shù)據(jù)和簽名數(shù)據(jù),使用基于SM3摘要算法的SM2算法實現(xiàn)驗證簽名值。文中選取了示例證書進行驗證,且驗證結果通過。
關鍵詞:國密算法;數(shù)字簽名;根證書;橢圓曲線
中圖分類號:TP393 文獻標識碼:A 文章編號:1009-3044(2019)04-0034-02
1 引言
隨著計算機技術及密碼技術的飛速發(fā)展,1024位RSA算法這一目前常用的算法已經(jīng)面臨嚴重的安全威脅,因此2010年12月17日國家密碼管理部門經(jīng)過研究,決定采用SM2橢圓曲線公鑰密碼算法來替換RSA算法。SM2算法相較于RSA算法來說,密碼復雜度更高、處理速度更快、機器性能消耗更小,整體來說性能更優(yōu)更安全。
目前來說,大多數(shù)情況下常使用的X509證書仍是基于RSA算法的,但既然國家已經(jīng)在大力推行國密算法,未來的各種基于PBOC3.0的IC卡也都是支持國密算法的,那基于國密算法的證書也將越來越廣泛地被采用,因此本文研究一下如何驗證SM2國密證書的合法性。
2 SM2證書介紹
SM2證書與RSA等其他數(shù)字證書相同點有:均使用ASN.1編碼;數(shù)據(jù)格式均使用通用的TLV(Tag Length Value)形式(T為類型標識符,L為長度值標識符,V代表實際數(shù)據(jù)。數(shù)字證書中的所有項都有對應的類型。完整的證書數(shù)據(jù)是一個TLV,而 V由多個TLV組合而成);均包含證書版本、序列號、頒發(fā)者、使用者主體信息、使用者公鑰、有效期、證書擴展項等內(nèi)容;均以二進制或Base64格式存放。
SM2證書與RSA證書不同的是SM2證書的公鑰算法是使用ECC算法的Oid標識(1.2.840.10045.2.1),公鑰參數(shù)使用SM2國密算法的Oid標識(1.2.156.10197.1.301)。
3 橢圓曲線算法原理
橢圓曲線是指在射影平面上滿足齊次方程Weierstrass方程的所有點的集合,( Weierstrass方程即:Y2Z+a1XYZ+a3YZ2=X3+a2X2Z+a4XZ2+a6Z3),并且橢圓曲線上的每個點都是非奇異(或光滑)的,在數(shù)學中,非奇異或光滑的指曲線上任意一點的偏導數(shù)不能同時都為0。下圖左為一個橢圓曲線的示例;而用于密碼學中的橢圓曲線與一般橢圓曲線不同的是它是離散的點,是不連續(xù)的,因此它需要定義在只由有限個元素組成的有限域上。下圖右為例。
橢圓加密算法是建立在橢圓曲線離散對數(shù)問題這一數(shù)學難題之上的密碼體制。所謂橢圓曲線離散對數(shù)問題即在橢圓曲線上給定兩個點K和G,若使K=kG,求整數(shù)k;這相對于給定橢圓曲線上的一個點G,并選取一個整數(shù)k,求解橢圓曲線上的另一個點K=kG來說是一個難題。在K=kG中,橢圓曲線上的點K為公鑰(這個點在OpenSSL里面是用結構體EC_Point來表示),整數(shù)k(實際上是一個大整數(shù))則為私鑰。
利用橢圓曲線進行加密通信的過程如下圖所示:
1)接收方選取橢圓曲線Ep(a,b)上的一點G作為基點并選擇一個私有密鑰k,生成公開密鑰K=kG,將Ep(a,b)和點K,G一起傳給發(fā)送方。
2)發(fā)送方收到橢圓曲線信息后將待傳輸?shù)拿魑木幋a到曲線上的一點M,產(chǎn)生一個隨機整數(shù)r,計算點C1=M+rK;C2=rG,并將C1、C2傳給接收方。
3)接收方收到信息后計算M=C1-kC2,再解碼M得到的就是明文。
如果有其他用戶看到這個加密通信過程中,那么其他用戶只能看到Ep(a,b)、K、G、C1、C2,而并不能得到明文信息,因為想要通過K、G 求k 或通過C2、G求r 都是相對困難的。
因此橢圓加密算法與一般非對稱密鑰體系的驗簽方法對比除了需要私鑰與公鑰以外,還需要私鑰與公鑰對應的橢圓曲線,因為簽名和驗簽的過程中用到涉及橢圓曲線得多倍點的乘法。所以僅僅知道公鑰和私鑰是不能調(diào)用OpenSSL自帶的簽名和驗簽API來實現(xiàn)橢圓加密算法的簽名驗證的,還需要知道對應的橢圓曲線。
4 簽名值驗證
驗證證書的合法性主要是解析證書、驗證證書的有效期、驗證頒發(fā)機構根證書、驗證CRL吊銷狀態(tài)以及使用目的等。本文主要研究證書中簽名數(shù)據(jù)的有效性驗證。前面已經(jīng)了解了SM2證書的結構,那么可以根據(jù)ASN.1語法和對象標識符來獲取相應數(shù)據(jù),證書的第一個數(shù)據(jù)塊是證書的實際內(nèi)容,即為簽名數(shù)據(jù)原文;第二個數(shù)據(jù)塊是證書使用的簽名算法,SM2證書配套的簽名算法是基于SM3摘要算法的SM2簽名算法,算法Oid標識為1.2.156.10197.1.501;證書的最后一個數(shù)據(jù)塊就是證書的簽名數(shù)據(jù),簽名數(shù)據(jù)由兩個BigInteger大數(shù)組成,再使用Der編碼存放。一般來說,證書的簽名數(shù)據(jù)都是其上級根證書私鑰簽名的,故需要使用上級根證書公鑰進行驗證,而頂級根證書的簽名數(shù)據(jù)是自簽名的,故需要使用自身的證書公鑰進行驗證。
本文選取了樣例證書進行了驗證,首先解析TLV結構獲取證書的簽名原文數(shù)據(jù)和簽名值數(shù)據(jù),其中簽名值數(shù)據(jù)為封裝的ECC簽名數(shù)據(jù)塊,需要解析后取出兩個大整數(shù),即曲線上點的X、Y坐標,如下圖中選中的數(shù)據(jù)即為簽名值數(shù)據(jù):
驗證簽名第一步需要組建數(shù)據(jù)ZA并計算其HASH值A:
ZA=用戶ID的長度+用戶ID+橢圓曲線公鑰密碼算法推薦曲線參數(shù)a+橢圓曲線公鑰密碼算法推薦曲線參數(shù)b+橢圓曲線公鑰密碼算法推薦曲線參數(shù)Gx+橢圓曲線公鑰密碼算法推薦曲線參數(shù)Gy+公鑰X+公鑰Y;
HashA=SM3摘要算法(ZA);
第二步,上面的SM3結果加上證書實際內(nèi)容數(shù)據(jù)M,再進行SM3計算得到HASH值B:
HashB=SM3摘要算法(HashA + M);
最后使用公鑰驗簽。
其中,曲線參數(shù)使用的國密推薦256位曲線參數(shù),具體值如下:
5 結論
按照上述驗證方法驗證了示例證書的簽名值、上級根證書的簽名值以及頂極根證書的自簽名值,均驗證通過。
正確的驗證SM2證書的合法性有利于國密算法的推廣使用,則在應用中的秘鑰生成速度和加解密速度均能達到更優(yōu)。
參考文獻:
[1] DayThinking. ECC算法原理的認識.https://blog.csdn.net/sszgg2006/article/details/41945163,2014.
[2] jonllen. SM2國密算法證書解析.(1998-08-16).[1998-10-04].http://www.cajcd.edu.cn/pub/wml.txt/980810-2.html,
[3] 方娜. 基于橢圓曲線的電子簽章系統(tǒng)的研究與應用[D]. 貴州大學, 2007.
【通聯(lián)編輯:唐一東】