本發(fā)明屬于信息安全技術(shù)領(lǐng)域,特別是一種sm2數(shù)字簽名的秘密共享生成方法及系統(tǒng)。
背景技術(shù):
在公開密鑰密碼體制中,為了保障用戶私鑰的安全性,用戶的私鑰通常是存儲在專門的密碼硬件中使用,如存儲在usbkey、smartcard中使用,且私鑰不能從密碼硬件中導出。但是,在有些情況下,比如,由于成本的原因,或者由于沒有合適的密碼硬件(如移動通信終端),使得用戶無法依賴密碼硬件來存儲私鑰、以及使用私鑰進行密碼運算。對于這種情況,目前最常用的方法是使用純軟件的密碼模塊,并將用戶私鑰保存在用戶計算裝置本地的永久存儲介質(zhì)中(如個人電腦的磁盤、移動通信終端內(nèi)的電子盤),并通過pin(personalidentificationnumber)碼對私鑰進行保護。當需要使用用戶私鑰時,軟件密碼模塊從用戶計算裝置的永久存儲介質(zhì)讀取用戶私鑰(必要時要求用戶輸入pin碼),然后進行密碼運算。這種采用純軟件密碼模、將用戶私鑰保存在用戶計算裝置本地的方式存在用戶私鑰泄露的風險,比如,攻擊者通過木馬竊取保存在用戶計算裝置中的用戶私鑰,破解用戶保護私鑰的pin碼,從而獲得用戶私鑰;而且這種采用純軟件密碼模塊的方式,用戶私鑰最終需以明文形式導入到內(nèi)存中使用,這樣攻擊者有可能通過一定的攻擊方式,竊取存放在內(nèi)存中的用戶私鑰。如何在不采用密碼硬件的情況下,安全存儲和使用用戶私鑰具有現(xiàn)實的需求,對此問題的解決具有很好的實際應用意義。
對此問題常見的解決方案是,將用戶私鑰通過一定的方式分割成多份,每份稱為秘密份額,然后將每份秘密份額存儲到不同的計算裝置中,尤其是將部分秘密份額存放在安全保護措施到位、安全條件好的專業(yè)的密碼服務機構(gòu)的在線密碼服務系統(tǒng)中;當密碼應用程序、系統(tǒng)需要使用用戶私鑰進行密碼運算時,如進行數(shù)字簽名或數(shù)據(jù)解密時,多個計算裝置分別使用自己的秘密份額進行密碼運算,最后將各裝置計算的結(jié)果合并,形成最后的、使用用戶私鑰進行密碼運算的結(jié)果(數(shù)字簽名或數(shù)據(jù)解密的結(jié)果)。
sm2是由國家密碼管理局頒布的一種橢圓曲線公鑰密碼算法(參見《sm2橢圓曲線公鑰密碼算法》規(guī)范,國家密碼管理局,2010年12月),基于此算法能實現(xiàn)數(shù)字簽名、密鑰交換及數(shù)據(jù)加密。但是,由于sm2算法獨特的數(shù)字簽名運算方式,通常的秘密共享(分割)方式及對應的基于秘密共享的密碼運算方式,無法適合于使用sm2私鑰進行數(shù)字簽名的情形。
技術(shù)實現(xiàn)要素:
本發(fā)明的目的是提出一種基于秘密分割(或共享)的sm2數(shù)字簽名生成方法,以滿足沒有密碼硬件的情況下,安全使用用戶sm2私鑰進行數(shù)字簽名的需求。
針對本發(fā)明的目的,本發(fā)明提出的技術(shù)方案是一種sm2數(shù)字簽名的秘密共享生成方法。
在以下對本發(fā)明技術(shù)方案的描述中,若p、q是橢圓曲線點群中的元素(點),則p+q表示p、q的點加,[k]p表示k個橢圓曲線點p的點加,即p+p+...+p(共有k個p);省略號“...”,表示多個同樣(類型)的數(shù)據(jù)項或多個同樣的運算;c-1表示整數(shù)c的模n乘法逆(即cc-1modn=1);多個整數(shù)相乘(包括整數(shù)符號相乘、常數(shù)與整數(shù)符號相乘),在不產(chǎn)生二義性的情況下,省略掉乘號“·”,如k1·k2簡化為k1k2,3·c,簡化位3c;modn表示模n運算(modulooperation),對應于《sm2橢圓曲線公鑰密碼算法》規(guī)范(國家密碼管理局,2010年12月)中的modn;還有,模n運算的算子modn的優(yōu)先級是最低的,如a+bmodn等同于(a+b)modn,a-bmodn等同于(a-b)modn,abmodn等同于(ab)modn。
本發(fā)明的方法具體如下。
所述方法涉及兩個分別稱為裝置1、裝置2的裝置;
裝置1分配有秘密份額d1,裝置2分配有秘密份額d2,其中d1、d2是[1,n-1]區(qū)間內(nèi)的整數(shù),而n是sm2密碼運算所使用的橢圓曲線點群的階,也即sm2密碼運算所使用的橢圓曲線點群的基點g的階(sm2密碼運算所使用的橢圓曲線點群是指由基點g生成的循環(huán)群);
兩個裝置的秘密份額與用戶的sm2私鑰da滿足關(guān)系:
(1+da)-1=d1d2modn,其中,(1+da)-1是(1+da)的模n乘法逆(即(1+da)-1(1+da)modn=1);
(兩個裝置都不擁有da;進行秘密分割、發(fā)放初始化操作的可以是一個專門的密鑰管理系統(tǒng),或者是用戶計算裝置中的一個密碼模塊、密鑰管理工具);
當需要使用用戶的sm2私鑰da針對消息m進行數(shù)字簽名時,兩個裝置按如下方式進行數(shù)字簽名的生成(需要使用用戶的sm2私鑰da、針對消息m進行數(shù)字簽名的主體可以是調(diào)用這兩個裝置的密碼應用程序、系統(tǒng)或密碼模塊,或者兩個裝置之一中的密碼應用程序、系統(tǒng)):
首先,兩個裝置通過交互計算得到q=[b(k1+k2)]g,r=(e+x1)modn,且得到的r、q滿足:r≠0且[r]g+q不是sm2橢圓曲線點群的零元(無窮遠點),其中k1、k2是計算q的過程中裝置1、裝置2分別在區(qū)間[1,n-1]中隨機選擇的整數(shù),b是區(qū)間[1,n-1]中的只有裝置1才知道的整數(shù)常數(shù)(秘密),或者b是計算q的過程中裝置1在區(qū)間[1,n-1]中隨機選擇的一個整數(shù),g是sm2橢圓曲線點群的基點,x1取自(x1,y1)=q,e是從用戶標識和消息m導出的雜湊值(即散列值)(本發(fā)明中的b不是橢圓曲線方程的參數(shù)b;按sm2算法,e是從用戶標識ida等參數(shù)導出的雜湊值za同消息m合并后的數(shù)據(jù)的雜湊值,參見sm2規(guī)范);
之后,裝置1計算s1=(k1+b-1r)modn,然后將s1發(fā)送給裝置2;
裝置2接收到裝置1的s1后,計算s2=d2(k2+s1)modn,然后將s2發(fā)送給裝置1;
裝置1接收到裝置2的s2后,計算s=(d1bs2-r)modn;(r,s)就是生成的針對消息m的數(shù)字簽名。
這里r是非保密數(shù)據(jù),根據(jù)需要可在兩個裝置之間傳遞。
若b是區(qū)間[1,n-1]中的只有裝置1才知道的整數(shù)常數(shù)(秘密),則在數(shù)字簽名生成之前的初始化過程中,(由初始化工具或系統(tǒng)或用戶計算裝置中的密碼模塊或密鑰管理工具)計算gb=[b]g,裝置1、裝置2分別保存gb;在針對消息m進行數(shù)字簽名時,裝置1和裝置2分別從本地保存的數(shù)據(jù)中獲得gb;
若b是計算q的過程中裝置1在區(qū)間[1,n-1]中隨機選擇的一個整數(shù),則在針對消息m進行數(shù)字簽名時,裝置1在區(qū)間[1,n-1]中隨機選擇一個整數(shù)b,計算得到gb=[b]g,然后將gb發(fā)送給裝置2,由此裝置1和裝置2都獲得gb。
在針對消息m進行數(shù)字簽名時,兩個裝置按如下方式,或者按與如下方式等同的方式,通過交互計算得到q=[b(k1+k2)]g,r=(e+x1)modn,且得到的r、q滿足:r≠0且[r]g+q不是sm2橢圓曲線點群的零元(無窮遠點):
首先,裝置1和裝置2分別從本地保存的數(shù)據(jù)中或通過實時計算和交換獲得gb,其中g(shù)b=[b]g;
之后,裝置1在區(qū)間[1,n-1]中隨機選擇一個整數(shù)k1,計算得到q1=[k1]gb;
裝置2在區(qū)間[1,n-1]中隨機選擇一個整數(shù)k2,計算得到q2=[k2]gb,然后將q2發(fā)送給裝置1;
裝置1接收到q2后,計算q=q1+q2,此時q=[b(k1+k2)]g;
裝置1檢查q是否是sm2橢圓曲線點群的零元(無窮遠點),若是,則裝置1重新選擇k1,重新計算q1=[k1]gb,重新計算q=q1+q2,重新判斷q是否是零元,重復此過程,直到q不是零元為止;若q不是零元,則裝置1取(x1,y1)=q,計算r=(e+x1)modn;
若計算得到的r、q滿足:r≠0且[r]g+q不是sm2橢圓曲線點群的零元(無窮遠點),則q、r的計算完成;否則,裝置1重新在區(qū)間[1,n-1]中隨機選擇一個整數(shù)k1,然后重新計算q1,q=q1+q2,重新判斷q是否是零元,以及在q不是零元時計算r,重復此過程,直到r≠0且[r]g+q不是sm2橢圓曲線點群的零元(無窮遠點);
或者,若r=0或[r]g+q是sm2橢圓曲線點群的零元(無窮遠點),則兩個裝置一起從頭重新進行q、r的計算(即裝置1和裝置2重新得到gb,裝置1重新選擇k1,裝置2重新選擇k2,然后計算q=q1+q2,判斷q是否是零元,以及在q不是零元時計算r=(e+x1)modn),重復此過程,直到r≠0且[r]g+q不是sm2橢圓曲線點群的零元(無窮遠點);
所述等同的方式,即同樣能得到q=[b(k1+k2)]g、并依據(jù)q計算得到r,且使得r、q滿足r≠0且[r]g+q不是sm2橢圓曲線點群的零元的方式。
若裝置1在計算得到q、r時,僅檢查r是否為零,不檢查[r]g+q是否是sm2橢圓曲線點群的零元(無窮遠點),且僅在r=0時重新進行q、r的計算(只要r≠0就不重新進行q、r計算),則:
裝置1計算得到s后,若檢查發(fā)現(xiàn)(s+r)modn=0,則放棄計算得到的s,裝置1重新在區(qū)間[1,n-1]中隨機選擇一個整數(shù)k1,重新計算q1,q=q1+q2,重新判斷q是否是零元,以及在q不是零元時計算r=(e+x1)modn,之后兩個裝置重新計算s1、s2、s,重復此過程,直到(s+r)modn≠0;
或者裝置1計算得到s后,若檢查發(fā)現(xiàn)(s+r)modn=0,則兩個裝置一起從頭重新進行q、r的計算(即裝置1和裝置2重新得到gb,裝置1重新選擇k1,計算q1,裝置2重新選擇k2,計算q2,然后裝置1重新計算q=q1+q2,判斷q是否是零元,以及在q不是零元時計算r=(e+x1)modn),兩個裝置重新計算s1、s2、s,直到(s+r)modn≠0。
在以上方案中,若b是計算q的過程中裝置1在區(qū)間[1,n-1]中隨機選擇的一個整數(shù),則k1既可以是計算q1時裝置1在區(qū)間[1,n-1]中隨機選擇的一個整數(shù),也可以是區(qū)間[1,n-1]中的只有裝置1才知道的整數(shù)常數(shù)(每次計算q1時都使用同一個k1)。
在本發(fā)明的方案中,用戶的公鑰仍然是dag,在進行數(shù)字簽名前計算并公開發(fā)布。
從以上發(fā)明內(nèi)容可以看到,基于本發(fā)明的sm2數(shù)字簽名的秘密共享生成方法,當用戶沒有硬件密碼裝置存放sm2私鑰時,可以將與用戶的私鑰da相關(guān)的秘密數(shù)據(jù)(1+da)-1分割成兩份秘密份額,分別存放在不同密碼服務機構(gòu)的密碼服務系統(tǒng),在需要使用用戶的sm2私鑰對消息進行簽名時,兩個機構(gòu)的密碼服務系統(tǒng)分別使用各自具有的秘密份額,通過交互最后生成針對消息的數(shù)字簽名;或者,兩份秘密份額中的一份存放在一個密碼服務機構(gòu)的密碼服務系統(tǒng)中,另一份存放到用戶的計算裝置中,當在需要使用用戶的sm2私鑰對消息進行簽名時,用戶的計算裝置和密碼服務機構(gòu)的密碼服務系統(tǒng)分別使用各自具有的秘密份額,通過交互最后生成針對消息的數(shù)字簽名;由于攻擊者同時獲得在兩個不同密碼服務機構(gòu)的密碼服務系統(tǒng)中的秘密份額,或者同時獲得在用戶計算裝置和密碼服務機構(gòu)的密碼服務系統(tǒng)中的秘密份額的可能性極低,這就大大提高了在沒有密碼硬件的情況下,用戶sm2私鑰使用的安全性。
具體實施方式
下面結(jié)合實施例對本發(fā)明作進一步的描述。以下實施例不作為對本發(fā)明的限定。
將秘密(1+da)-1分割為d1、d2,且(1+da)-1=d1d2modn是很容易的:在[1,n-1]中隨機選擇一個整數(shù)作為d1,之后,計算d2=(d1)-1(1+da)-1modn即可。
實施例1、
在此實施例中,用戶的計算裝置(如個人電腦、移動通信終端)是本發(fā)明的sm2數(shù)字簽名分割生成方法中的兩個裝置中的一個(裝置1或裝置2),另一個裝置是一個密碼服務系統(tǒng)中的密碼服務器(作為裝置2或裝置1);用戶的計算裝置和密碼服務器都不保存用戶的sm2私鑰da、(1+da)-1;(1+da)-1的秘密份額d1、d2,一份保存在用戶計算裝置中,另一份保存在密碼服務器中;當用戶計算裝置中的密碼應用程序或系統(tǒng)要使用用戶的sm2私鑰da對消息進行簽名時,用戶計算裝置(實際上,通常是用戶計算裝置中的密碼模塊)與密碼服務器交互,應用本發(fā)明的方法、使用秘密份額d1、d2生成消息的數(shù)字簽名。
實施例2、
在此實施例中,本發(fā)明的sm2數(shù)字簽名分割生成方法中的一個裝置是一個機構(gòu)的密碼服務系統(tǒng)中的密碼服務器,另一個裝置是另一個機構(gòu)的密碼服務系統(tǒng)中的密碼服務器;用戶計算裝置以及兩個密碼服務機構(gòu)的密碼服務器都不保存用戶的sm2私鑰da、(1+da)-1;(1+da)-1的兩份秘密份額d1、d2,分別保存在兩個密碼服務系統(tǒng)的密碼服務器中;當用戶計算裝置中的密碼應用程序或系統(tǒng)要使用用戶的sm2私鑰da對消息進行簽名時,用戶計算裝置(通常是用戶計算裝置中的密碼模塊)將請求發(fā)送到一個密碼服務系統(tǒng),之后兩個密碼服務系統(tǒng)的密碼服務器通過交互,應用本發(fā)明的方法、使用秘密份額d1、d2生成消息的數(shù)字簽名,然后將生成的簽名被返回給用戶計算裝置;在數(shù)字簽名生成過程中,分屬兩個密碼服務系統(tǒng)的兩個密碼服務器中的任一個可以都作為本發(fā)明的數(shù)字簽名生成方法中的裝置1,另一個作為裝置2。
基于本發(fā)明的方法,很容易構(gòu)建實施本發(fā)明方法的系統(tǒng)。
基于本發(fā)明的方法構(gòu)建的sm2數(shù)字簽名生成系統(tǒng)包括兩個裝置,其中,一個裝置是用戶計算裝置,另一個是密鑰服務系統(tǒng)的密碼服務器,或者兩個裝置都是密鑰服務系統(tǒng)的密碼服務器;兩個裝置按前面所述sm2數(shù)字簽名的秘密共享生成方法,生成使用用戶sm2私鑰da對消息m的數(shù)字簽名。
其他未說明的具體技術(shù)實施,對于相關(guān)領(lǐng)域的技術(shù)人員而言是眾所周知,不言自明的。