廖會(huì)敏 王 棟 玄佳興 楊 珂 李麗麗
(國網(wǎng)電子商務(wù)有限公司(國網(wǎng)雄安金融科技集團(tuán)有限公司) 北京 100053)(國家電網(wǎng)有限公司電力金融與電子商務(wù)實(shí)驗(yàn)室 北京 100053)
公鑰密碼算法也稱為非對稱密碼算法,其密鑰對由公鑰和私鑰組成。已知私鑰可以推導(dǎo)出公鑰,但已知公鑰不能推導(dǎo)出私鑰,公鑰對外公開,私鑰由用戶自己秘密保存[1]。我國的公鑰密碼算法包括SM2橢圓曲線公鑰密碼算法[2](Elliptic Curve Cryptography,ECC)和SM9標(biāo)識(shí)密碼算法(Identity-Based Cryptography,IBC)[3-4]。2018年11月,SM2/SM9算法正式成為ISO/IEC國際標(biāo)準(zhǔn),納入國際標(biāo)準(zhǔn)算法并發(fā)布,標(biāo)志著我國密碼算法國際標(biāo)準(zhǔn)體系已初步成形,為有效保障網(wǎng)絡(luò)空間安全貢獻(xiàn)了中國智慧,提供了中國方案。
基于公鑰密碼學(xué)的數(shù)字簽名和加解密技術(shù)已在移動(dòng)支付、身份認(rèn)證、電子簽名等場景中得到了廣泛的應(yīng)用,成為保證網(wǎng)絡(luò)信息安全的重要手段。門限密碼學(xué)的基礎(chǔ)是秘密共享,一個(gè)門限秘密共享方案可以將一段秘密信息共享于幾個(gè)參與方之間,每一次秘密計(jì)算都需要多個(gè)參與方同意,從而提高算法安全性和健壯性[7]。隨著移動(dòng)通信、物聯(lián)網(wǎng)、云計(jì)算的興起,門限密碼學(xué)的思想與智能終端對密鑰的安全存儲(chǔ)、安全計(jì)算的需求不謀而合,為了提高私鑰的安全性,現(xiàn)有方案中基于門限密碼學(xué)的思想提出了將用戶私鑰分割為幾份并分布存儲(chǔ),以避免全部私鑰直接存儲(chǔ)在智能終端內(nèi)存中極易被攻擊者破解的風(fēng)險(xiǎn)。文獻(xiàn)[11]概述性地描述了SM2門限密碼算法;文獻(xiàn)[12]給出了SM2算法門限簽名及解密的方法;文獻(xiàn)[13-14]給出了SM9算法的門限簽名及解密的方法。但以上方案若在攻擊者同時(shí)攻擊兩方的情況下,其私鑰仍存在被竊取的可能性。
本文在前人研究基礎(chǔ)上,提出一種以密碼機(jī)為輔助設(shè)備的基于國產(chǎn)公鑰密碼算法的門限簽名及解密方案,該方案具有以下優(yōu)點(diǎn):(1) 提出了一種SM2/SM9算法門限簽名及解密的私鑰分量的生成方法,以密碼機(jī)為輔助設(shè)備,在密碼機(jī)內(nèi)部生成私鑰分量或分割私鑰,其中一份私鑰分量直接存儲(chǔ)在服務(wù)端密碼機(jī)內(nèi),外部獲得完整私鑰的可能性趨近于零;(2) 針對實(shí)際的應(yīng)用場景,密碼機(jī)內(nèi)存儲(chǔ)的私鑰分量可以是固定的,也可以一個(gè)應(yīng)用對應(yīng)一個(gè)固定的私鑰分量,以應(yīng)對密碼機(jī)不能存儲(chǔ)海量私鑰分量的問題。
定義1素域Fp具有如下性質(zhì):(1) 加法單位元是0,乘法單位元是1;(2) 域元素的加法是整數(shù)模p加法,即若a,b∈Fp,則a+b=(a+b)modp;(3) 域元素的乘法是整數(shù)模p乘法,即若a,b∈Fp,則a·b=(a·b)modp。
定義3設(shè)G和GT是階為素?cái)?shù)N的循環(huán)群,g是G的生成元,e:G×G→GT是雙線性映射,滿足以下性質(zhì)[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) 可計(jì)算性:存在有效的算法,對于任意的P,Q∈G,均可計(jì)算e(P,Q)。
SM2算法的公開參數(shù)包括(q,n,E,G),其中:q是大素?cái)?shù),E是定義在有限域Fq上的橢圓曲線,G=(xG,yG)是E上n階的基點(diǎn)。本文主要介紹SM2算法的密鑰生成、簽名算法和解密算法,有關(guān)SM2算法的詳細(xì)信息可參考文獻(xiàn)[17]。
1) 密鑰生成。SM2算法的密鑰生成過程如下:(1) 隨機(jī)選取密鑰d,且d∈[1,n-2];(2) 計(jì)算P=[d]G,并將P作為公鑰公開,d作為私鑰保存。
2) SM2簽名算法。設(shè)待簽名的消息為M,為了獲取消息M的數(shù)字簽名(r,s),簽名者應(yīng)實(shí)現(xiàn)以下運(yùn)算步驟:
(1) 對待簽名消息M進(jìn)行簽名預(yù)處理,得到消息摘要e;
(2) 用隨機(jī)數(shù)發(fā)生器產(chǎn)生隨機(jī)數(shù)k∈[1,n-1];
(3) 計(jì)算橢圓曲線點(diǎn)(x1,y1)=[k]G;
(4) 計(jì)算r=(e+x1)modn,若r=0或r+k=n,則返回(3);
(5) 計(jì)算s=((1+d)-1·(k-r·d))modn,若s=0,則返回(3);
(6) 消息M的簽名數(shù)據(jù)為(r,s)。
3) SM2解密算法。設(shè)密文為C=C1‖C2‖C3,klen為密文C2的位長,為了對C進(jìn)行解密,解密者應(yīng)實(shí)現(xiàn)以下運(yùn)算步驟:
(1) 將C1的數(shù)據(jù)類型轉(zhuǎn)換為橢圓曲線上的點(diǎn),驗(yàn)證C1是否滿足橢圓曲線方程,若滿足則進(jìn)行下一步;
(2) 計(jì)算[d]C1=(x2,y2),將坐標(biāo)(x2,y2)的數(shù)據(jù)類型轉(zhuǎn)換為比特串;
(3) 計(jì)算t=KDF(x2‖y2,klen),若t為0,則報(bào)錯(cuò)退出;
(4) 計(jì)算M′=C2⊕t;
(5) 計(jì)算u=Hash(x2‖M′‖y2),若u≠C3,則報(bào)錯(cuò)退出;
(6) 輸出明文M′。
SM9算法的公開參數(shù)包括(cid,N,k,P1,P2,eid),其中:cid是曲線識(shí)別符,N是循環(huán)群G1、G2和GT的階,k是曲線E(Fq)相對于N的嵌入次數(shù),P1是G1的生成元,P2是G2的生成元,eid是雙線性對e的識(shí)別符。本文主要介紹SM9算法的密鑰生成、簽名算法和解密算法,有關(guān)SM9算法的詳細(xì)信息可參考文獻(xiàn)[18]。
1) 密鑰生成。SM9標(biāo)識(shí)算法的密鑰包含用戶的ID和私鑰,該私鑰由密鑰生成中心(Key generation center,KGC)通過主私鑰和用戶的標(biāo)識(shí)結(jié)合產(chǎn)生。
KGC產(chǎn)生隨機(jī)數(shù)ks∈[1,N-1]作為主私鑰,計(jì)算G1中的元素Ppub=[ks]P1作為加密主公鑰,則主密鑰對為(ks,Ppub),KGC保存ks,公開Ppub。
KGC選擇并公開用一個(gè)字節(jié)表示的私鑰生成函數(shù)識(shí)別符hid,然后KGC在有限域FN上計(jì)算t1=H1(ID‖hid,N)+ks,計(jì)算t2=ks·t1-1,計(jì)算d=[t2]P2,即用戶ID的私鑰為d。
2) SM9簽名算法。設(shè)待簽名的消息為比特串M,為了獲取消息M的數(shù)字簽名(h,s),簽名者應(yīng)實(shí)現(xiàn)以下運(yùn)算步驟:
(1) 計(jì)算群GT中的元素g=e(P1,Ppub);
(2) 產(chǎn)生隨機(jī)數(shù)r∈[1,N-1];
(3) 計(jì)算群GT中的元素w=gr,將w的數(shù)據(jù)類型轉(zhuǎn)換為比特串;
(4) 計(jì)算整數(shù)h=H2(M‖w,N);
(5) 計(jì)算整數(shù)l=(r-h)modN,若l=0則返回(2);
(6) 計(jì)算群GT中的元素s=[l]d;
(7) 將h和s的數(shù)據(jù)類型轉(zhuǎn)換為字節(jié)串,消息的簽名為(h,s)。
3) SM9解密算法。設(shè)密文為C=C1‖C2‖C3,mlen為密文C的位長,K1_len為對稱密碼算法中K1的比特長度,K2_len為函數(shù)MAC(K2,Z)中密鑰K2的比特長度。為了對C進(jìn)行解密,解密者應(yīng)實(shí)現(xiàn)以下運(yùn)算步驟:
(1) 將C1的數(shù)據(jù)類型轉(zhuǎn)換為橢圓曲線上的點(diǎn),驗(yàn)證C1∈G1是否成立,若不成立則報(bào)錯(cuò)并退出;
(2) 計(jì)算群GT中的元素w′=e(C1,dB),將w′的數(shù)據(jù)類型轉(zhuǎn)換為比特串;
(6) 輸出明文M′。
SM2算法的門限方案包括SM2門限簽名和門限解密。
2) 門限簽名。設(shè)待簽名的消息為M,門限簽名的過程如下:
(1) 客戶端對待簽名消息M進(jìn)行簽名預(yù)處理,得到消息摘要e,產(chǎn)生隨機(jī)數(shù)k1∈[1,n-1],計(jì)算w1=[k1]G;
(2) 客戶端把e、w1發(fā)送給服務(wù)端;
(3) 服務(wù)端密碼機(jī)產(chǎn)生隨機(jī)數(shù)k2∈[1,n-1],計(jì)算w2=[k2]G;
(4) 服務(wù)端密碼機(jī)產(chǎn)生隨機(jī)數(shù)k3∈[1,n-1],計(jì)算(a1,b1)=[k3]w1+w2,計(jì)算r′=a1+emodn;
(5) 服務(wù)端判斷若r′不等于0,則計(jì)算s2=d2·k3,計(jì)算s22=d2·(r′+k2);
(6) 服務(wù)端將r′、s2和s22發(fā)送給客戶端;
(7) 客戶端計(jì)算s′=((d1·k1)·s2+d1·s22-r′)modn;
(8) 若s′不等于0且不等于n-r′,客戶端將(r′,s′)作為完整的簽名結(jié)果輸出。
1) 密鑰生成。客戶端和服務(wù)端密碼機(jī)分別生成隨機(jī)數(shù)d1和d2,且有d1,d2∈[1,n-1],客戶端計(jì)算P1=[d1]G,將P1發(fā)送給服務(wù)端。服務(wù)端密碼機(jī)接收服務(wù)端傳送的P1,并計(jì)算計(jì)算P=P1+[d2]G,將P作為公鑰公開。
2) 門限解密。設(shè)待簽名的消息為M,門限解密的過程如下(這里只對1.2節(jié)中SM2算法解密過程的步驟(1)-步驟(2)進(jìn)行擴(kuò)展,其他步驟未用到門限解密的操作):
(1) 客戶端計(jì)算v1=[d1]C1;
(2) 服務(wù)端密碼機(jī)計(jì)算v2=[d2]C1,并將v2的值發(fā)送給客戶端;
SM9算法的門限方案包括SM9算法的門限簽名和門限解密。
1) 密鑰生成。服務(wù)端密鑰生成中心KGC(本文方案中KGC指服務(wù)端密碼機(jī))生成隨機(jī)數(shù)a,計(jì)算私鑰分量d1=[a·t2]P1并發(fā)送給客戶端,計(jì)算私鑰分量d2=a-1modN并直接存儲(chǔ)在密碼機(jī)內(nèi)作為服務(wù)端私鑰分量,銷毀d1。
2) 門限簽名。設(shè)待簽名的消息為M,門限簽名的過程如下:
(1) 服務(wù)端密碼機(jī)計(jì)算群GT中的元素g=e(P1,Ppub);
(2) 密碼機(jī)產(chǎn)生隨機(jī)數(shù)r∈[1,N-1];
(3) 密碼機(jī)計(jì)算群GT中的元素w=gr;
(4) 密碼機(jī)計(jì)算整數(shù)h′=H2(M‖w,N);
(5) 密碼機(jī)計(jì)算整數(shù)L=(r-h′)modN,若L=0則返回(2);
(6) 密碼機(jī)計(jì)算群GT中的元素s2=[L]d2,并通過服務(wù)端將h′和s2發(fā)送給客戶端;
(7) 客戶端計(jì)算s=d1·s2;
(8) 客戶端得到消息的簽名為(h′,s′)。
1) 密鑰生成。服務(wù)端密鑰生成中心KGC根據(jù)用戶的標(biāo)識(shí)ID、主私鑰產(chǎn)生用戶的私鑰d,密碼機(jī)隨機(jī)生成d1∈[1,d-1],計(jì)算d2=d-d1,密碼機(jī)通過服務(wù)端將d1發(fā)送給客戶端作為客戶端私鑰分量,同時(shí)密碼機(jī)直接保存d2作為服務(wù)端的私鑰分量,然后銷毀d1。
2) 門限解密。為了對密文C進(jìn)行解密,客戶端和服務(wù)端需實(shí)現(xiàn)以下運(yùn)算步驟(這里只對1.3節(jié)中SM9算法解密過程的步驟(1)-步驟(2)進(jìn)行擴(kuò)展,其他步驟未用到門限解密的操作):
(1) 客戶端將C1的數(shù)據(jù)類型轉(zhuǎn)換為橢圓曲線上的點(diǎn),驗(yàn)證C1∈G1是否成立,若不成立則報(bào)錯(cuò)并退出;
本文方案中一份私鑰分量存儲(chǔ)在客戶端,一份私鑰分量存儲(chǔ)在服務(wù)端密碼機(jī)中。存儲(chǔ)在客戶端的私鑰分量由于采用軟件的存儲(chǔ)方式,存在被攻擊者竊取的可能。由于密碼機(jī)的特性,密碼機(jī)中的服務(wù)端私鑰分量被攻擊者竊取的可能性趨近于零,這樣即使客戶端的私鑰分量被竊取,攻擊者也無法獲得完整的私鑰,私鑰的安全性有保障。
隨機(jī)數(shù)的生成和使用對SM2/SM9的簽名算法和解密算法的安全性起著關(guān)鍵性的作用,比如在標(biāo)準(zhǔn)SM2簽名算法中,在已知隨機(jī)數(shù)k和簽名(r,s)的情況下,則可通過如下操作推導(dǎo)(破解)私鑰d:
由s=((1+d)-1·(k-r·d))modn,得(1+d)·s=(k-r·d)modn,進(jìn)而(k+s)·d=(k-s)modn,因此d=(k+s)-1·(k-s)modn,私鑰d被破解。
本文方案中客戶端和服務(wù)端分別產(chǎn)生隨機(jī)數(shù)k1、k2、k3,即便攻擊者在已知k1和簽名(r,s)的情況下(k2和k3由密碼機(jī)產(chǎn)生,攻擊者不可能破解),攻擊者也不能推導(dǎo)出(破解)私鑰d。
本文方案中公鑰密碼算法的私鑰分割成兩份后,分別存儲(chǔ)在智能終端客戶端和服務(wù)端密碼機(jī)中,由于密碼機(jī)的特性,服務(wù)端的私鑰分量不可能被破解,攻擊者不能獲得完整的私鑰,保證了私鑰的安全性。通過本方案開發(fā)的產(chǎn)品可以將軟件密碼模塊的形態(tài)應(yīng)用于智能終端,用于各種應(yīng)用場景的身份認(rèn)證、數(shù)字簽名、數(shù)據(jù)加解密等。
結(jié)合實(shí)際的應(yīng)用場景,為了保證客戶端私鑰分量和門限簽名或門限解密過程的安全,采用下列方式對其進(jìn)行安全加固:
(1) 客戶端私鑰分量采用PIN碼、手勢驗(yàn)證碼等保護(hù);
(2) 客戶端私鑰分量可以和智能終端硬件信息、ID等綁定;
(3) 服務(wù)端存儲(chǔ)客戶端私鑰分量的Hash值,在簽名或解密請求前,客戶端需先向服務(wù)端提交私鑰分量Hash值一致性驗(yàn)證,服務(wù)端對比客戶端私鑰分量的Hash值,待Hash值一致后再執(zhí)行簽名操作,這樣可以防止客戶端的私鑰分量被破壞仿冒;
(4) 門限簽名或門限解密的請求由服務(wù)端發(fā)起,防止客戶端攻擊。
在本文方案中,服務(wù)端私鑰分量存儲(chǔ)在服務(wù)端密碼機(jī)中,在實(shí)際應(yīng)用場景中服務(wù)端密碼機(jī)可能需要存儲(chǔ)大量用戶的服務(wù)端私鑰分量,由于密碼機(jī)的存儲(chǔ)空間有限,在本方案的基礎(chǔ)上,可以進(jìn)一步將密碼機(jī)中的服務(wù)端私鑰分量固定,解決密碼機(jī)存儲(chǔ)限制和用戶海量私鑰分量的存儲(chǔ)。
公鑰密碼算法是現(xiàn)代密碼學(xué)的重要組成部分,SM2算法和SM9算法是我國自主知識(shí)產(chǎn)權(quán)的公鑰密碼算法。本文在門限密碼學(xué)的基礎(chǔ)上,以密碼機(jī)為輔助設(shè)備,提出了一種國產(chǎn)公鑰密碼算法的門限簽名及解密方案。該方案中,密碼算法私鑰的安全系數(shù)更高,更貼合實(shí)際的應(yīng)用場景。依據(jù)該方案開發(fā)的密碼模塊可以軟件的形態(tài)在移動(dòng)終端、物聯(lián)網(wǎng)智能終端中得到廣泛的應(yīng)用,用于解決網(wǎng)絡(luò)安全中的身份認(rèn)證、數(shù)字簽名、數(shù)據(jù)傳輸安全、隱私保護(hù)等問題。