天天看點

國密SM2算法

目錄

1 前言

2 基礎參數

3 密鑰對生成

4 簽名算法

4.1 預處理1

4.2 預處理2

4.3 生成簽名

4.4 簽名驗證

4.5 簽名驗證原理

5 參考資料

1 前言

比原鍊的智能合約支援國密算法的函數。SM2是國密标準的橢圓曲線加密算法,遵循以下SM2國家标準:

GB/T 32918.1-2016

GB/T 32918.2-2016

GB/T 32918.3-2016

GB/T 32918.4-2016

GB/T 32918.5-2017

GB/T 35275-2017

GB/T 35276-2017

橢圓曲線算法那公鑰密碼所基于的曲線性質:橢圓曲線多倍點運算構成一個單向函數。在多倍點運算中,已知多倍點與基點,求解倍數的問題稱為橢圓曲線離散對數問題。對于一般橢圓曲線的離散對數問題,目前隻存在指數級計算複雜度的求解方法。與大數分解問題及有限域上離散對數問題相比,橢圓曲線離散對數問題的求解難度要大得多。是以,在相同安全程度要求下,橢圓曲線密碼較其他公鑰密碼所需的秘鑰規模要小得多。

數字簽名算法由一個簽名者對資料産生數字簽名,并由一個驗證者驗證簽名的可靠性。每個簽名者都有一個公鑰和一個私鑰,其中私鑰用于産生簽名,驗證者用簽名者的公鑰驗證簽名。在簽名的生成過程之前,要用密碼雜湊算法對 ZA Z_AZ 

A

​    

  和待簽消息 M MM 進行壓縮;在驗證過程之前,要用密碼雜湊算法對 ZA Z_AZ 

A

​    

  和待簽消息 M MM 進行同樣的壓縮。

2 基礎參數

SM2的曲線方程為 y2=x3+ax+b \displaystyle y^2 = x^3 + ax + by 

2

 =x 

3

 +ax+b ,其中:

a aa:0xFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFC

b bb:0x28E9FA9E9D9F5E344D5A9E4BCF6509A7F39789F515AB8F92DDBCBD414D940E93

p pp:0xFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFF

私鑰長度:32位元組。

公鑰長度:SM2非壓縮公鑰格式位元組串長度為65位元組,壓縮格式長度為33位元組,若公鑰y坐标最後一位為0,則首位元組為0x02,否則為0x03。非壓縮格式公鑰首位元組為0x04。

簽名長度:64位元組。

3 密鑰對生成

SM2密鑰生成是指生成SM2算法的密鑰對的過程,該密鑰對包括私鑰和與之對應的公鑰。

輸入:無

輸出:

k:SM2PrivateKey,SM2私鑰

Q:SM2PublicKey,SM2公鑰

用随機數發生器産生整數 d∈[1,n−2] \displaystyle d\in[1,n-2]d∈[1,n−2] ;

G GG 為基點,計算點 P=(xP,yP)=[d]G \displaystyle P=(x_P,y_P)=[d]GP=(x 

P

​    

 ,y 

P

​    

 )=[d]G 。

則私鑰是d dd,公鑰為P PP。

4 簽名算法

4.1 預處理1

預處理1是指使用簽名方的使用者身份辨別和簽名方公鑰,通過運算得到Z值的過程。Z值用于預處理2。

輸入:

ID:字元串,使用者身份辨別

Q:SM2PublicKey,使用者的公鑰

輸出:

Z:位元組串,預處理1的輸出

計算公式:Z=SM3(ENTL∣∣ID∣∣a∣∣b∣∣xG∣∣yG∣∣xA∣∣yA) Z=SM3(ENTL||ID||a||b||x_G||y_G||x_A||y_A)Z=SM3(ENTL∣∣ID∣∣a∣∣b∣∣x 

G

​    

 ∣∣y 

G

​    

 ∣∣x 

A

​    

 ∣∣y 

A

​    

 )

參數說明:

ENTL ENTLENTL:為由2個位元組辨別的ID的比特長度;

ID IDID:為使用者身份辨別。無特殊約定的情況下,使用者身份辨別ID的長度為16位元組,其預設值從左至右依次為:0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38。

a,b a,ba,b:為系統曲線參數;

xG, yG \displaystyle x_G,\ y_Gx 

G

​    

 , y 

G

​    

  為基點;

xA, yA \displaystyle x_A,\ y_Ax 

A

​    

 , y 

A

​    

  為使用者的公鑰。

4.2 預處理2

預處理2是指使用Z值和待簽名消息,通過SM3運算得到雜湊值H的過程。雜湊值H用于SM2數字簽名。

輸入:

Z:位元組串,預處理2的輸入

M:位元組串,待簽名消息

輸出:

H:位元組串,雜湊值

計算公式:H=SM3(Z∣∣M) \displaystyle H=SM3(Z||M)H=SM3(Z∣∣M)

4.3 生成簽名

SM2簽名是指使用預處理2的結果和簽名者的私鑰,通過簽名計算得到簽名結果的過程。

輸入:

d:SM2PrivateKey,簽名者私鑰

H:位元組串,預處理2的結果

輸出:

sign:SM2Signature,簽名值

設待簽名的消息為M,為了擷取消息M的數字簽名 (r,s) (r,s)(r,s),作為簽名者的使用者A應實作以下運算步驟:

置 M¯¯¯¯=ZA∣∣M \displaystyle \overline{M}=Z_A||M 

M

 =Z 

A

​    

 ∣∣M ;

計算 e=Hv(M¯¯¯¯) \displaystyle e=H_v(\overline{M})e=H 

v

​    

 ( 

M

 ) ,将 e ee 的資料類型轉化為整數;

用随機數發生器産生随機數 k∈[1,n−1] \displaystyle k\in[1,n-1]k∈[1,n−1] ;

計算橢圓曲線點 (x1,y1)=[k]G \displaystyle (x_1,y_1)=[k]G(x 

1

​    

 ,y 

1

​    

 )=[k]G ,将 x1 \displaystyle x_1x 

1

​    

  的資料類型轉化為整數;

計算 r=(e+x1)mod n \displaystyle r=(e+x_1) mod \ nr=(e+x 

1

​    

 )mod n ,若 r=0 r = 0r=0 或 r+k=n r + k = nr+k=n 則傳回第3步;

計算 s=((1+dA)−1⋅(k−r⋅dA))mod n \displaystyle s=((1+d_A)^{-1}\cdot (k-r \cdot d_A)) mod\ ns=((1+d 

A

​    

 ) 

−1

 ⋅(k−r⋅d 

A

​    

 ))mod n ,若 s=0 s=0s=0 則傳回第3步;

将 r,s r, sr,s 轉化為位元組串。

消息M的簽名為(r,s) (r, s)(r,s)。

4.4 簽名驗證

SM2簽名驗證是指使用預處理2的結果、簽名值和簽名者的公鑰,通過驗簽計算确定簽名是否通過驗證的過程。

輸入:

H:位元組串,預處理2的結果

sign:SM2Signature,簽名值

Q:PublicKey,簽名者的公鑰

輸出:為真表示驗證通過,為假表示驗證不通過。

為了檢驗收到的消息 M及其數字簽名(r,s) (r, s)(r,s),作為驗證者的使用者B應實作以下運算步驟:

檢驗 r∈[1,n−1] \displaystyle r\in[1,n-1]r∈[1,n−1] 是否成立,若不成立則驗證不通過;

檢驗 s∈[1,n−1] \displaystyle s\in[1,n-1]s∈[1,n−1] 是否成立,若不成立則驗證不通過;

置 M¯¯¯¯=ZA∣∣M \displaystyle \overline{M}=Z_A||M 

M

 =Z 

A

​    

 ∣∣M ;

計算 e=Hv(M¯¯¯¯) \displaystyle e=H_v(\overline{M})e=H 

v

​    

 ( 

M

 ) ,将e ee的資料類型轉化為整數;

将 r,s r,sr,s 的資料類型轉化為整數,計算 t=(r+s)mod n \displaystyle t=(r+s) mod \ nt=(r+s)mod n ,若 t=0 t=0t=0,則驗證不通過;

計算橢圓曲線點 (x1,y1)=[s]G+[t]PA \displaystyle (x_1,y_1)=[s]G+[t]P_A(x 

1

​    

 ,y 

1

​    

 )=[s]G+[t]P 

A

​    

  ;

将 x1 \displaystyle x_1x 

1

​    

  的資料類型轉化為整數,計算 R=(e+x1)mod n \displaystyle R=(e+x_1) mod \ nR=(e+x 

1

​    

 )mod n ,檢驗 R=r R=rR=r 是否成立,若成立則驗證通過;否則驗證不通過。

4.5 簽名驗證原理

[s]G+[t]PA=sG+(r+s)PA=sG+(r+s)dAG=sG+sdAG+rdAG=(1+dA)sG+rdAG=(1+dA)(1+dA)−1(k−rdA)G+rdAG=(k−rdA)G+rdAG=kG−rdAG+rdAG=kG=(x1,y1) \displaystyle\begin{aligned}[s]G+[t]P_A&=sG+(r+s)P_A\\&=sG+(r+s)d_AG\\&=sG+s d_AG+rd_AG\\&=(1+d_A)sG+rd_AG\\&=(1+d_A)(1+d_A)^{-1}(k-rd_A)G+rd_AG\\&=(k-rd_A)G+rd_AG\\&=kG-rd_AG+rd_AG\\&=kG\\&=(x_1,y_1)\end{aligned}

[s]G+[t]P 

A

​    

​    

=sG+(r+s)P 

A

​    

=sG+(r+s)d 

A

​    

 G

=sG+sd 

A

​    

 G+rd 

A

​    

 G

=(1+d 

A

​    

 )sG+rd 

A

​    

 G

=(1+d 

A

​    

 )(1+d 

A

​    

 ) 

−1

 (k−rd 

A

​    

 )G+rd 

A

​    

 G

=(k−rd 

A

​    

 )G+rd 

A

​    

 G

=kG−rd 

A

​    

 G+rd 

A

​    

 G

=kG

=(x 

1

​    

 ,y 

1

​    

 )

​    

5 參考資料

SM2國密标準文檔:有關國密SM2算法的線上文檔。

繼續閱讀