一種基於餘數系統的SM2白盒數字籤名實現方法與流程
2023-06-06 14:27:56 3

本發明涉及信息安全技術領域,特別是涉及一種基於餘數系統的SM2白盒數字籤名實現方法。
背景技術:
現有軟體加密算法,密鑰均是直接出現在計算平臺的內存之中,攻擊者可通過惡意軟體等實現密鑰的竊取,不能應對已有的白盒攻擊手段;現有的硬體加密算法,能較好的保證密鑰計算的安全性,但相對使用成本較高,通用性較差,對於部分安全性要求相對較低的應用場景無法使用;同時還有部分研究機構提出了基於雲加端部分密鑰和密鑰分散存儲策略的軟體加密算法,但云加端的策略無法抵抗本地私鑰的洩露,還存儲雲端與終端的鑑權問題,密鑰分散存儲策略在進行密鑰運算時必須合成密鑰,內存中同樣存在密鑰完整明文。
技術實現要素:
為解決上述問題,本發明提供了一種基於餘數系統的SM2白盒數字籤名實現方法,所述方法適用的系統包括客戶端和伺服器,所述系統的系統模數為n,輔助模數為mr所選取橢圓曲線的基點為G,籤名消息為M其特徵在於,包括如下步驟:
步驟一:客戶端選取公鑰d、私鑰P。選定一個餘數系統,素數基為β=(p1,p2,...,pt),基β的動態範圍滿足ω=p1p2p3…pt≥2768。
步驟二:客戶端生成第一私鑰查找表、第二私鑰查找表。具體方法為:
步驟2.1:隨機選取兩個非線性密鑰置換表,分別記為Sbox1、Sbox2,並通過伺服器的公鑰將自己的客戶端ID和Sbox1發送給伺服器進行保存。
步驟2.2:使用餘數系統將公鑰P轉化為Pi,其中i=1,…,t,r,並生成第一私鑰查找表Table1,i(i=1,...,t,r),生成方法為:隨機遍歷產生兩個隨機數N1和N2,其中N2,N1∈[1,n-1],通過餘數系統將其分別轉化為N1i和N2i,計算ui=sbox2(N1,i×sbox1-1(sbox1(N2,i))modpi),將遍歷產生的所有ui作為表Table1,i(i=1,...,t,r)的元素。
步驟2.3:使用私鑰d和餘數系統生成第二私鑰查找表Table2,i(i=1,...,t,r),生成方法為:隨機遍歷產生兩個隨機數L1和L2,其中L2,L1∈[1,n-1],通過餘數系統將其分別轉化為L1i和L2i,同時將私鑰d轉換為di,計算si=di×(sbox2-1(L1i)-L2i×di)mod pi,將遍歷產生的所有si作為表Table2,i(i=1,...,t,r)的元素;
步驟三:客戶端進行籤名,具體方法為:
步驟3.1:客戶端計算M』=M||ZA;其中,M為籤名消息,ZA為客戶端的身份標識。
步驟3.2:客戶端用雜湊函數計算消息摘要e=Hv(M』)。
步驟3.3:客戶端產生第一隨機數k1∈[1,n-1];
步驟3.4:客戶端計算橢圓曲線點Q1=[k1]*G,並將e和Q1發送給伺服器;其中,
步驟3.5:伺服器產生第二隨機數k2∈[1,n-1];
步驟3.6:伺服器計算橢圓曲線點(x1,y1)=[k2]*Q1;
步驟3.7:伺服器計算第一部分籤名r=(x1+e)mod n,將第二隨機數k2基於基{β|pr}用餘數系統表示為k2=(k2,1,...,k2,t|k2,r),通過Sbox1進行混淆,然後將r和Sbox1(k2)=[sbox1(k2,1),sbox1(k2,2),...,sbox1(k2,t)|sbox1(k2,r)]發送給客戶端。
步驟3.8:客戶端將第一隨機數K1和r基於基{β|pr}用餘數系統表示為k1=(k1,1,k1,2,...,k1,t|k1,r)和r=(r1,r2,...,rt|rr);
步驟3.9:客戶端使用第一私鑰查找表Table1,i(i=1,...,t,r)計算中間值ui=sbox2(k1,i×sbox1-1(sbox1(k2,i))modpi)。
步驟4.0:客戶端使用第二私鑰查找表Table2,i(i=1,...,t,r)計算si=di×(sbox2-1(ui)-ri×dA,i)mod pi,其中私鑰dA隱藏在第二私鑰查找表Table2,i中。
步驟4.1:客戶端利用中國剩餘定理恢復出s。
步驟4.3:客戶端計算s′=s mod n,s′即為第二部分籤名值。
步驟五:輸出消息M和籤名。
進一步的,各個隨機數是利用隨機數發生器產生。
本發明的有益效果為:
(1)客戶端在進行籤名運算過程中,內存等硬體設備中不會出現私鑰的完整明文,確保密碼算法運行的白盒攻擊安全。
(2)實現本方法僅需要207.5MB的內層大小,存儲空間要求較小。
(3)本實現方法和原SM2算法的籤名效率基本一致,實用性較高。
(4)通過使用白盒軟體實現可降低商用密碼算法的使用成本,擴大商用密碼算法的使用範圍。
(5)使用白盒軟體算法在確保加解密安全的同時,通用性較強,對運行平臺硬體沒有任何特殊需求。
附圖說明
圖1為客戶端進行籤名的流程示意圖。
具體實施方式
本發明的設計構思為:針對於不可信環境中密鑰運行不安全,惡意攻擊者可通過白盒攻擊手段獲取系統密鑰的問題展開研究,通過使用餘數系統實現大數的拆分,從而降低密鑰表的大小;通過使用置亂混淆確保中間結果對攻擊者不可見;通過使用雲端的隨機因子確保終端密鑰運算關係的未知性,實現了終端籤名運算過程中的籤名私鑰安全,同時可使用標準的SM2驗籤算法進行驗證。
本發明基於國家商用密碼算法SM2數字籤名算法進行構建,SM2數字籤名算法請參加國家商用密碼管理局發布的管理標準,同時本發明還使用了一個典型的數學工具——餘數系統,詳細介紹如下:
餘數系統的定義可以描述為:現假設存在一個餘數系統,它是由一組互為質數的餘數基β=(m1,m2,...,mk}來確定的,M=m1m2…mk為這組基的動態範圍。對於任意整數x≤M,可以在β這組基下唯一表示為(x1,x2,...,xk),其中xi為x對mi的求模結果,記為對餘數系統而言,只有當整數x在動態範圍之內才存在唯一的表示。
假設整數x、y在基β下分別表示為x=(x1,x2,...,xk)和y=(y1,y2,...,yk),則:
其中「ο″為+、-、×運算。
對於x的餘數系統表示(x1,x2,...,xk),由中國剩餘定理:
其中α<k,Mi=M/mi,為Mi在模mi下的逆。α可通過選擇一個合適的輔助模數mr來恢復,其中mr≥k+1且gcd(M,mr)=1。設xr為x對mr的求模結果,即:
則:
因為α<k<mr,所以對於任意整數x,可在擴展基下表示為(x1,x2,...,xk|xr),稱為擴展RNS表示。
本發明所述方法適用的系統包括客戶端和伺服器。客戶端也就是執行數字籤名算法的用戶,其運行環境是不可信的,伺服器是協同籤名方,其屬於密鑰管理中心的一個部件,它主要為客戶端提供一個隨機因子。
假定所述系統的系統模數為n,輔助模數為mr,所選取橢圓曲線的基點為G,籤名消息為M,ZA為客戶端的身份標識,Hv為使用的摘要函數(可實用商用密碼標準SM3算法)。本方法共包含4個部分:(1)參數選取及密鑰生成;(2)私鑰表的生成;(3)籤名計算;(4)驗籤計算。其中(1)和(4)均參考國家商用SM2數字籤名算法標準執行。
本發明的具體步驟描述如下:
步驟一:客戶端選取公鑰d、私鑰P。選定一個餘數系統,素數基為β=(p1,p2,...,pt),基β的動態範圍滿足ω=p1p2p3…pt≥2768。
步驟二:客戶端生成第一私鑰查找表、第二私鑰查找表。具體方法為:
步驟2.1:隨機選取兩個非線性密鑰置換表(與對稱密碼算法中使用的S盒是一致的),分別記為Sbox1、Sbox2,並通過伺服器的公鑰將自己的客戶端ID和Sbox1發送給伺服器進行保存。
步驟2.2:使用餘數系統將公鑰P轉化為Pi,其中i=1,…,t,r,並生成第一私鑰查找表Table1,i(i=1,...,t,r),生成方法為:隨機遍歷產生兩個隨機數N1和N2,其中N2,N1∈[1,n-1],通過餘數系統將其分別轉化為N1i和N2i,計算ui=sbox2(N1,i×sbox1-1(sbox1(N2,i))modpi),將遍歷產生的所有ui作為表Table1,i(i=1,...,t,r)的元素。
步驟2.3:使用私鑰d和餘數系統生成第二私鑰查找表Table2,i(i=1,...,t,r),生成方法為:隨機遍歷產生兩個隨機數L1和L2,其中L2,L1∈[1,n-1],通過餘數系統將其分別轉化為L1i和L2i,同時將私鑰d轉換為di,計算si=di×(sbox2-1(L1i)-L2i×di)mod pi,將遍歷產生的所有si作為表Table2,i(i=1,...,t,r)的元素;
步驟三:客戶端進行籤名,具體方法為:
步驟3.1:客戶端計算M』=M||ZA;其中,M為籤名消息,ZA為客戶端的身份標識。
步驟3.2:客戶端用雜湊函數計算消息摘要e=Hv(M』)。
步驟3.3:客戶端用隨機數發生器產生第一隨機數k1∈[1,n-1];
步驟3.4:客戶端計算橢圓曲線點Q1=[k1]*G,並將e和Q1發送給伺服器;其中,
步驟3.5:伺服器用隨機數發生器產生第二隨機數k2∈[1,n-1];
步驟3.6:伺服器計算橢圓曲線點(x1,y1)=[k2]*Q1;
步驟3.7:伺服器計算第一部分籤名r=(x1+e)mod n,將第二隨機數k2基於基{β|pr}用餘數系統表示為k2=(k2,1,...,k2,t|k2,r),通過Sbox1進行混淆,然後將r和Sbox1(k2)=[sbox1(k2,1),sbox1(k2,2),...,sbox1(k2,t)|sbox1(k2,r)]發送給客戶端。
步驟3.8:客戶端將第一隨機數k1和r基於基{β|pr}用餘數系統表示為k1=(k1,1,k1,2,...,k1,t|k1,r)和r=(r1,r2,...,rt|rr);
步驟3.9:客戶端使用第一私鑰查找表Table1,i(i=1,...,t,r)計算中間值ui=sbox2(k1,i×sbox1-1(sbox1(k2,i))modpi)。
步驟4.0:客戶端使用第二私鑰查找表Table2,i(i=1,...,t,r)計算si=di×(sbox2-1(ui)-ri×dA,i)mod pi,其中私鑰dA隱藏在第二私鑰查找表Table2,i中。
步驟4.1:客戶端利用中國剩餘定理恢復出s。
步驟4.3:客戶端計算s′=s mod n,s′即為第二部分籤名值。
步驟五:輸出消息M和籤名。
進一步的,各個隨機數是利用隨機數發生器產生。