本發(fā)明涉及一種基于sm2算法的簽名方法。
背景技術:
數(shù)字簽名是通過某種密碼運算生成一系列符號及代碼組成電子密碼進行簽名,來代替書寫簽名或印章,對于這種電子式的簽名還可進行技術驗證,其驗證的準確度是一般手工簽名和圖章的驗證而無法比擬的。數(shù)字簽名是目前電子商務、電子政務中應用最普遍、技術最成熟的、可操作性最強的一種電子簽名方法。
為了提高數(shù)字簽名的安全性,簽名算法逐漸向著交互少、減少傳輸參數(shù)數(shù)量方向發(fā)展,并逐漸提高算法的處理效率。
申請公布號為cn104243456a的中國發(fā)明專利公開了一種“適用于云計算的基于sm2算法的簽名及解密方法和系統(tǒng)”,它可在通信雙方分別存儲部分私鑰,兩方聯(lián)合才能對消息進行簽名或解密等操作,通信雙方均無法獲取到對方私鑰的任何信息,因此攻擊者在入侵其中任何一方的情況下,都不能偽造簽名或解密密文,從而提高了云計算環(huán)境中的私鑰的安全性;而且,簽名過程和解密過程中,通信雙方僅需要進行的交互也簡化了很多,從而能夠滿足云計算環(huán)境中低延遲、少交互的應用需求。但第一通信方和第二通信方均產(chǎn)生長度在[1,n-1]之間的子私鑰,其乘積可能大于n,在實際運算中私鑰會大于n-2,造成私鑰過大導致簽名溢出風險。而且,在簽名運算過程中運算過程相對比較繁瑣,需要額外條件進行處理,在輸出簽名過程中,也需要多次網(wǎng)絡交互計算,降低了運算效率。
技術實現(xiàn)要素:
為了避免私鑰過大導致簽名溢出風險,并進一步簡化算法,提升運算效率,本發(fā)明提供一種基于sm2算法的簽名方法。
本發(fā)明提出以下技術方案:一種基于sm2算法的簽名方法,它包括如下步驟:
步驟a:密鑰生成,
客戶端與服務端共享sm2橢圓曲線算法參數(shù)e(fq)、g、n、z,橢圓曲線e為定義在有限域fq上的橢圓曲線,g為橢圓曲線e上n階的基點,z為雙方的共有身份標識;
客戶端生成自身的子密鑰a,服務端生成自身的子密鑰b,客戶端和服務端交互生成公鑰p;
步驟b:簽名運算;
其特征在于,
所述步驟a中,客戶端與服務端均采用限制次冪方式生成隨機子密鑰a和b,使子密鑰a和b的乘積小于n-2;計算a、b逆元交互處理,形成常量v,計算輸出公鑰p;
所述步驟b的簽名運算包括以下步驟:
步驟b1:客戶端根據(jù)待簽原文m生成e,同時隨機生成dh交互k11,將e和k11傳輸至服務端;
步驟b2:服務端隨機生成dh交互k22發(fā)送至客戶端,客戶端和服務端協(xié)商臨時密鑰k,進而由客戶端生成部分簽名q2;
步驟b3:客戶端將q2傳輸至服務端,服務端同步計算r和s,最終輸出簽名值[r,s]。
進一步的,所述步驟a中,采用限制次冪方式生成隨機子密鑰a和b的方法為:客戶端與服務端共享的sm2橢圓曲線算法參數(shù)還包括c和t,c=log2n,且c取整數(shù);t=2q(c/2),其中q函數(shù)為取整數(shù)函數(shù);
使隨機生成的子密鑰a介于[1,t]之間,子密鑰b介于[1,t]之間;
計算a、b逆元交互處理,形成常量v,計算輸出公鑰p的方法為:客戶端計算a的逆元a-1modn得到其值為v1;計算a[*]g得到其值為p1;將v1和p1發(fā)送至服務端;服務端計算b的逆元b-1modn得到其值為v2,計算(v1*v2)modn的結果記為v;計算公鑰信息p=p1[*]b[-]g。
進一步的,所述步驟b1包括:客戶端將z和m拼裝成m’,計算hash(m’),獲取其結果為e;
客戶端隨機生成隨機數(shù)k1,使得k1介于[1,n]之間,計算2k1modn作為k11。
進一步的,所述步驟b2包括:
服務端隨機生成隨機數(shù)k2,使得k2介于[1,n]之間,計算2k2modn作為k22,服務端將k22發(fā)送至客戶端;
此時客戶端利用k22k1modn和服務端利用k11k2modn進行計算,均可得到相同的值為k;
在客戶端,計算橢圓曲線上的點d(x,y)=k[*]g、計算(e+x)modn得到r,若r是為0或r+k等于n則需要重新協(xié)商生成k,計算q2=a*r,并將q2發(fā)送至服務端。
進一步的,所述步驟b3包括:
服務端接收到q2后,通過同樣的計算公式,d(x,y)=k[*]g、計算(e+x)modn得到r,[v*(k-q2*b+r)]modn,即可得到簽名值s;若s等于0則需要重新生成k進行簽名運算;運算后將[r,s]作為最終簽名值輸出。
有益效果:
1、通過限制次冪的方式,使得各個子密鑰乘積均不會大于n-2,保障子密鑰合成后的最終密鑰小于n-2,規(guī)避了私鑰過大導致簽名溢出風險。
2、云端通過預計算的方式,將合成簽名值中的部分信息先行計算,方便后續(xù)合成代入,提升處理效率。實現(xiàn)并行運算。在簽名過程中,通過交互完成k的計算后,雙方即可同時進行并行運算計算r值,不用再進行r值的網(wǎng)絡交互。
3、簽名過程采用dh交互,用于雙方生成臨時參數(shù)k,在減少傳輸參數(shù)數(shù)量的情況下,僅傳輸大數(shù)乘積,不容易被破解還原子密鑰。
4、定量存儲,利用空間贏取時間。在最終s簽名輸出的過程中,直接采用了在生成密鑰對時輸出的v值,不再重復計算(v1*v2)modn,提升運算效率。
附圖說明
圖1為本發(fā)明的方法流程圖。
具體實施方式
如圖1所示,本方法的大致流程為:s1、客戶端與服務端均采用限制次冪方式生成隨機子密鑰a和b,計算a、b逆元交互處理,形成常量v,計算輸出公鑰p。s2、客戶端根據(jù)待簽原文m生成e,同時隨機生成dh交互k11,將e和k11傳輸至服務端。s3、服務端隨機生成dh交互k22發(fā)送至客戶端,客戶端和服務端協(xié)商臨時密鑰k,進而由客戶端生成部分簽名q2。s4、客戶端將q2傳輸至服務端,服務端同步計算r和s,最終輸出簽名值[r,s]。
下面對本方法的具體流程做詳細說明:本方法主要包括密鑰生成和簽名運算兩個過程。
1、密鑰生成過程
客戶端與服務端共享sm2橢圓曲線算法參數(shù)e(fq)、g、n、c、z、t,橢圓曲線e為定義在有限域fq上的橢圓曲線,g為橢圓曲線e上n階的基點,c=log2n,且c取整數(shù);t=2q(c/2),其中q函數(shù)為取整數(shù)函數(shù),z為雙方共同的身份標識。
客戶端生成隨機數(shù)a,使得a介于[1,t],作為客戶端的子密鑰。
服務端生成隨機數(shù)b,使得b介于[1,t],作為服務端的子密鑰。
客戶端計算a的逆元a-1modn得到其值為v1;計算a[*]g,得到其值為p1。將v1和p1發(fā)送至服務端;服務端計算b的逆元b-1modn,得到其值為v2,計算(v1*v2)modn其結果記為v;計算公鑰信息p=p1[*]b[-]g,其中[*]為橢圓曲線點乘計算,[-]為橢圓曲線點減計算。
上述即完成了密鑰的生成和分發(fā),客戶端子密鑰為a,服務端子密鑰為b,且含有公鑰p和關鍵字v。
2、簽名運算的過程
客戶端將z和m拼裝成m’,計算hash(m’),獲取其結果為e,hash表示為預定的哈希函數(shù)。
客戶端隨機生成隨機數(shù)k1,使得k1介于[1,n]之間,計算2k1modn作為k11。
客戶端將e和k11發(fā)送至服務端。
服務端隨機生成隨機數(shù)k2,使得k2介于[1,n]之間,計算2k2modn作為k22。
服務端將k22發(fā)送至客戶端。
此時客戶端利用k22k1modn和服務端利用k11k2modn進行計算,均可得到相同的值為k。
在客戶端,計算橢圓曲線上的點d(x,y)=k[*]g、計算(e+x)modn得到r,若r是為0或r+k等于n則需要重新協(xié)商生成k,計算q2=a*r,并將q2發(fā)送至服務端。其中[*]表示曲線上的點乘(下同)。
服務端接收到q2后,通過同樣的計算公式,d(x,y)=k[*]g、計算(e+x)modn得到r,[v*(k-q2*b+r)]modn,即可得到簽名值s。若s等于0則需要重新生成k進行簽名運算。運算后將[r,s]作為最終簽名值輸出。