廖會敏 王 棟 玄佳興 楊 珂 李麗麗
(國網電子商務有限公司(國網雄安金融科技集團有限公司) 北京 100053)(國家電網有限公司電力金融與電子商務實驗室 北京 100053)
公鑰密碼算法也稱為非對稱密碼算法,其密鑰對由公鑰和私鑰組成。已知私鑰可以推導出公鑰,但已知公鑰不能推導出私鑰,公鑰對外公開,私鑰由用戶自己秘密保存[1]。我國的公鑰密碼算法包括SM2橢圓曲線公鑰密碼算法[2](Elliptic Curve Cryptography,ECC)和SM9標識密碼算法(Identity-Based Cryptography,IBC)[3-4]。2018年11月,SM2/SM9算法正式成為ISO/IEC國際標準,納入國際標準算法并發布,標志著我國密碼算法國際標準體系已初步成形,為有效保障網絡空間安全貢獻了中國智慧,提供了中國方案。
基于公鑰密碼學的數字簽名和加解密技術已在移動支付、身份認證、電子簽名等場景中得到了廣泛的應用,成為保證網絡信息安全的重要手段。門限密碼學的基礎是秘密共享,一個門限秘密共享方案可以將一段秘密信息共享于幾個參與方之間,每一次秘密計算都需要多個參與方同意,從而提高算法安全性和健壯性[7]。隨著移動通信、物聯網、云計算的興起,門限密碼學的思想與智能終端對密鑰的安全存儲、安全計算的需求不謀而合,為了提高私鑰的安全性,現有方案中基于門限密碼學的思想提出了將用戶私鑰分割為幾份并分布存儲,以避免全部私鑰直接存儲在智能終端內存中極易被攻擊者破解的風險。文獻[11]概述性地描述了SM2門限密碼算法;文獻[12]給出了SM2算法門限簽名及解密的方法;文獻[13-14]給出了SM9算法的門限簽名及解密的方法。但以上方案若在攻擊者同時攻擊兩方的情況下,其私鑰仍存在被竊取的可能性。
本文在前人研究基礎上,提出一種以密碼機為輔助設備的基于國產公鑰密碼算法的門限簽名及解密方案,該方案具有以下優點:(1) 提出了一種SM2/SM9算法門限簽名及解密的私鑰分量的生成方法,以密碼機為輔助設備,在密碼機內部生成私鑰分量或分割私鑰,其中一份私鑰分量直接存儲在服務端密碼機內,外部獲得完整私鑰的可能性趨近于零;(2) 針對實際的應用場景,密碼機內存儲的私鑰分量可以是固定的,也可以一個應用對應一個固定的私鑰分量,以應對密碼機不能存儲海量私鑰分量的問題。
定義1素域Fp具有如下性質:(1) 加法單位元是0,乘法單位元是1;(2) 域元素的加法是整數模p加法,即若a,b∈Fp,則a+b=(a+b)modp;(3) 域元素的乘法是整數模p乘法,即若a,b∈Fp,則a·b=(a·b)modp。

定義3設G和GT是階為素數N的循環群,g是G的生成元,e:G×G→GT是雙線性映射,滿足以下性質[15-16]:(1) 雙線性:對任意的P1,P2,Q1,Q2∈G,有e(P1+P2,Q1)=e(P1,Q1)·e(P2,Q1),e(P1,Q1+Q2)=e(P1,Q1)·e(P1,Q2);(2) 可計算性:存在有效的算法,對于任意的P,Q∈G,均可計算e(P,Q)。
SM2算法的公開參數包括(q,n,E,G),其中:q是大素數,E是定義在有限域Fq上的橢圓曲線,G=(xG,yG)是E上n階的基點。本文主要介紹SM2算法的密鑰生成、簽名算法和解密算法,有關SM2算法的詳細信息可參考文獻[17]。
1) 密鑰生成。SM2算法的密鑰生成過程如下:(1) 隨機選取密鑰d,且d∈[1,n-2];(2) 計算P=[d]G,并將P作為公鑰公開,d作為私鑰保存。
2) SM2簽名算法。設待簽名的消息為M,為了獲取消息M的數字簽名(r,s),簽名者應實現以下運算步驟:
(1) 對待簽名消息M進行簽名預處理,得到消息摘要e;
(2) 用隨機數發生器產生隨機數k∈[1,n-1];
(3) 計算橢圓曲線點(x1,y1)=[k]G;
(4) 計算r=(e+x1)modn,若r=0或r+k=n,則返回(3);
(5) 計算s=((1+d)-1·(k-r·d))modn,若s=0,則返回(3);
(6) 消息M的簽名數據為(r,s)。
3) SM2解密算法。設密文為C=C1‖C2‖C3,klen為密文C2的位長,為了對C進行解密,解密者應實現以下運算步驟:
(1) 將C1的數據類型轉換為橢圓曲線上的點,驗證C1是否滿足橢圓曲線方程,若滿足則進行下一步;
(2) 計算[d]C1=(x2,y2),將坐標(x2,y2)的數據類型轉換為比特串;
(3) 計算t=KDF(x2‖y2,klen),若t為0,則報錯退出;
(4) 計算M′=C2⊕t;
(5) 計算u=Hash(x2‖M′‖y2),若u≠C3,則報錯退出;
(6) 輸出明文M′。
SM9算法的公開參數包括(cid,N,k,P1,P2,eid),其中:cid是曲線識別符,N是循環群G1、G2和GT的階,k是曲線E(Fq)相對于N的嵌入次數,P1是G1的生成元,P2是G2的生成元,eid是雙線性對e的識別符。本文主要介紹SM9算法的密鑰生成、簽名算法和解密算法,有關SM9算法的詳細信息可參考文獻[18]。
1) 密鑰生成。SM9標識算法的密鑰包含用戶的ID和私鑰,該私鑰由密鑰生成中心(Key generation center,KGC)通過主私鑰和用戶的標識結合產生。
KGC產生隨機數ks∈[1,N-1]作為主私鑰,計算G1中的元素Ppub=[ks]P1作為加密主公鑰,則主密鑰對為(ks,Ppub),KGC保存ks,公開Ppub。
KGC選擇并公開用一個字節表示的私鑰生成函數識別符hid,然后KGC在有限域FN上計算t1=H1(ID‖hid,N)+ks,計算t2=ks·t1-1,計算d=[t2]P2,即用戶ID的私鑰為d。
2) SM9簽名算法。設待簽名的消息為比特串M,為了獲取消息M的數字簽名(h,s),簽名者應實現以下運算步驟:
(1) 計算群GT中的元素g=e(P1,Ppub);
(2) 產生隨機數r∈[1,N-1];
(3) 計算群GT中的元素w=gr,將w的數據類型轉換為比特串;
(4) 計算整數h=H2(M‖w,N);
(5) 計算整數l=(r-h)modN,若l=0則返回(2);
(6) 計算群GT中的元素s=[l]d;
(7) 將h和s的數據類型轉換為字節串,消息的簽名為(h,s)。
3) SM9解密算法。設密文為C=C1‖C2‖C3,mlen為密文C的位長,K1_len為對稱密碼算法中K1的比特長度,K2_len為函數MAC(K2,Z)中密鑰K2的比特長度。為了對C進行解密,解密者應實現以下運算步驟:
(1) 將C1的數據類型轉換為橢圓曲線上的點,驗證C1∈G1是否成立,若不成立則報錯并退出;
(2) 計算群GT中的元素w′=e(C1,dB),將w′的數據類型轉換為比特串;

(6) 輸出明文M′。
SM2算法的門限方案包括SM2門限簽名和門限解密。

2) 門限簽名。設待簽名的消息為M,門限簽名的過程如下:
(1) 客戶端對待簽名消息M進行簽名預處理,得到消息摘要e,產生隨機數k1∈[1,n-1],計算w1=[k1]G;
(2) 客戶端把e、w1發送給服務端;
(3) 服務端密碼機產生隨機數k2∈[1,n-1],計算w2=[k2]G;
(4) 服務端密碼機產生隨機數k3∈[1,n-1],計算(a1,b1)=[k3]w1+w2,計算r′=a1+emodn;
(5) 服務端判斷若r′不等于0,則計算s2=d2·k3,計算s22=d2·(r′+k2);
(6) 服務端將r′、s2和s22發送給客戶端;
(7) 客戶端計算s′=((d1·k1)·s2+d1·s22-r′)modn;
(8) 若s′不等于0且不等于n-r′,客戶端將(r′,s′)作為完整的簽名結果輸出。
1) 密鑰生成。客戶端和服務端密碼機分別生成隨機數d1和d2,且有d1,d2∈[1,n-1],客戶端計算P1=[d1]G,將P1發送給服務端。服務端密碼機接收服務端傳送的P1,并計算計算P=P1+[d2]G,將P作為公鑰公開。
2) 門限解密。設待簽名的消息為M,門限解密的過程如下(這里只對1.2節中SM2算法解密過程的步驟(1)-步驟(2)進行擴展,其他步驟未用到門限解密的操作):
(1) 客戶端計算v1=[d1]C1;
(2) 服務端密碼機計算v2=[d2]C1,并將v2的值發送給客戶端;
SM9算法的門限方案包括SM9算法的門限簽名和門限解密。
1) 密鑰生成。服務端密鑰生成中心KGC(本文方案中KGC指服務端密碼機)生成隨機數a,計算私鑰分量d1=[a·t2]P1并發送給客戶端,計算私鑰分量d2=a-1modN并直接存儲在密碼機內作為服務端私鑰分量,銷毀d1。
2) 門限簽名。設待簽名的消息為M,門限簽名的過程如下:
(1) 服務端密碼機計算群GT中的元素g=e(P1,Ppub);
(2) 密碼機產生隨機數r∈[1,N-1];
(3) 密碼機計算群GT中的元素w=gr;
(4) 密碼機計算整數h′=H2(M‖w,N);
(5) 密碼機計算整數L=(r-h′)modN,若L=0則返回(2);
(6) 密碼機計算群GT中的元素s2=[L]d2,并通過服務端將h′和s2發送給客戶端;
(7) 客戶端計算s=d1·s2;
(8) 客戶端得到消息的簽名為(h′,s′)。
1) 密鑰生成。服務端密鑰生成中心KGC根據用戶的標識ID、主私鑰產生用戶的私鑰d,密碼機隨機生成d1∈[1,d-1],計算d2=d-d1,密碼機通過服務端將d1發送給客戶端作為客戶端私鑰分量,同時密碼機直接保存d2作為服務端的私鑰分量,然后銷毀d1。
2) 門限解密。為了對密文C進行解密,客戶端和服務端需實現以下運算步驟(這里只對1.3節中SM9算法解密過程的步驟(1)-步驟(2)進行擴展,其他步驟未用到門限解密的操作):
(1) 客戶端將C1的數據類型轉換為橢圓曲線上的點,驗證C1∈G1是否成立,若不成立則報錯并退出;


本文方案中一份私鑰分量存儲在客戶端,一份私鑰分量存儲在服務端密碼機中。存儲在客戶端的私鑰分量由于采用軟件的存儲方式,存在被攻擊者竊取的可能。由于密碼機的特性,密碼機中的服務端私鑰分量被攻擊者竊取的可能性趨近于零,這樣即使客戶端的私鑰分量被竊取,攻擊者也無法獲得完整的私鑰,私鑰的安全性有保障。
隨機數的生成和使用對SM2/SM9的簽名算法和解密算法的安全性起著關鍵性的作用,比如在標準SM2簽名算法中,在已知隨機數k和簽名(r,s)的情況下,則可通過如下操作推導(破解)私鑰d:
由s=((1+d)-1·(k-r·d))modn,得(1+d)·s=(k-r·d)modn,進而(k+s)·d=(k-s)modn,因此d=(k+s)-1·(k-s)modn,私鑰d被破解。
本文方案中客戶端和服務端分別產生隨機數k1、k2、k3,即便攻擊者在已知k1和簽名(r,s)的情況下(k2和k3由密碼機產生,攻擊者不可能破解),攻擊者也不能推導出(破解)私鑰d。
本文方案中公鑰密碼算法的私鑰分割成兩份后,分別存儲在智能終端客戶端和服務端密碼機中,由于密碼機的特性,服務端的私鑰分量不可能被破解,攻擊者不能獲得完整的私鑰,保證了私鑰的安全性。通過本方案開發的產品可以將軟件密碼模塊的形態應用于智能終端,用于各種應用場景的身份認證、數字簽名、數據加解密等。
結合實際的應用場景,為了保證客戶端私鑰分量和門限簽名或門限解密過程的安全,采用下列方式對其進行安全加固:
(1) 客戶端私鑰分量采用PIN碼、手勢驗證碼等保護;
(2) 客戶端私鑰分量可以和智能終端硬件信息、ID等綁定;
(3) 服務端存儲客戶端私鑰分量的Hash值,在簽名或解密請求前,客戶端需先向服務端提交私鑰分量Hash值一致性驗證,服務端對比客戶端私鑰分量的Hash值,待Hash值一致后再執行簽名操作,這樣可以防止客戶端的私鑰分量被破壞仿冒;
(4) 門限簽名或門限解密的請求由服務端發起,防止客戶端攻擊。
在本文方案中,服務端私鑰分量存儲在服務端密碼機中,在實際應用場景中服務端密碼機可能需要存儲大量用戶的服務端私鑰分量,由于密碼機的存儲空間有限,在本方案的基礎上,可以進一步將密碼機中的服務端私鑰分量固定,解決密碼機存儲限制和用戶海量私鑰分量的存儲。
公鑰密碼算法是現代密碼學的重要組成部分,SM2算法和SM9算法是我國自主知識產權的公鑰密碼算法。本文在門限密碼學的基礎上,以密碼機為輔助設備,提出了一種國產公鑰密碼算法的門限簽名及解密方案。該方案中,密碼算法私鑰的安全系數更高,更貼合實際的應用場景。依據該方案開發的密碼模塊可以軟件的形態在移動終端、物聯網智能終端中得到廣泛的應用,用于解決網絡安全中的身份認證、數字簽名、數據傳輸安全、隱私保護等問題。