SM2數字簽名算法由一個簽名者對數據產生數字簽名,并由一個驗證者驗證簽名的可靠性。每個簽名者有一個公鑰和一個私鑰,其中私鑰用于產生簽名,驗證者用簽名者的公鑰驗證簽名。在簽名的生成過程之前,要用密碼雜湊函數對M (包含ZA和待簽消息M)進行壓縮;在驗證過程之前,要用密碼雜湊函數對M′(包含ZA和驗證消息M′)進行壓縮。
SM2推薦橢圓曲線參數如下:
使用素數域256位橢圓曲線
橢圓曲線方程:y2 = x3 + ax + b
p= FFFFFFFE FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF 00000000 FFFFFFFF FFFFFFFF
a= FFFFFFFE FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF 00000000 FFFFFFFF FFFFFFFC
b= 28E9FA9E 9D9F5E34 4D5A9E4B CF6509A7 F39789F5 15AB8F92 DDBCBD41 4D940E93
n= FFFFFFFE FFFFFFFF FFFFFFFF FFFFFFFF 7203DF6B 21C6052B 53BBF409 39D54123
Gx= 32C4AE2C 1F198119 5F990446 6A39C994 8FE30BBF F2660BE1 715A4589 334C74C7
Gy= BC3736A2 F4F6779C 59BDCEE3 6B692153 D0A9877C C62A4740 02DF32E5 2139F0A0
數字簽名生成流程:
關鍵參數說明:
ZA=H256(ENT LA || IDA || a || b || xG || yG || xA || yA) (SM3算法做摘要)
ENT LA : 用戶ID的位長度
IDA :用戶ID
xA :公鑰X
yA :公鑰Y
M :ZA || M (ZA 與 M拼接)
e : 密碼雜湊函數作用于消息M的輸出值(SM3(ZA||M)預處理得到的結果)
k : [1,n-1]范圍內的隨機數
r : (e+x1)mod n (mod同余定理)
S :((1+dA)-1 *(k-r*dA)) mod n (dA 用戶的私鑰 )