目錄
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算法的線上文檔。