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