sm2算法是國密標準的非對稱算法標準。基于ecc的擴展
橢圓曲線算法
破解難度高于rsa算法。
橢圓曲線方程:y2=x3+ax+b
獲取公私鑰的大概步驟:
- 確認a、b,確認曲線。
- 選擇一個點P為基點
- 對曲線做切線、x對稱點運行。次數為 d,運算倍點為Q
- d 為私鑰, Q 為公鑰
密鑰對的生成:
基于上面的理論,一般函數實現方式為:
- 產生隨機整數 d [1,n-2]
- G為基點,計算點 P=(xP,yP)=[d]G;
- 密鑰對為: (d,P) 其中,d為私鑰,P為公鑰
sm2簽名、驗簽算法
簽名和驗簽一般用在身份確認
簽名
M為待簽名消息,數字簽名結果為(r,s) ,用戶密鑰對(d,P)。
實現步驟:
- e=hash(M) //獲取消息散列值
- 產生隨機數 k //以便即使是同一個消息,每次簽名出來的結果不同。
- 使用隨機數,計算橢圓曲線點(x1,y1)=[k]G
- r=(e+x1) mod n //判斷:r=0 或者 r+k=n, 繼續第2步。
- s= ((1+d)-1 * (k-r*d)) mod n , 若s=0,繼續第2步
- r,s 為簽名信息。
驗簽
M為明文,(r,s)為簽名結果,用戶公鑰P
實現步驟:
- e=hash(M)
- t=(r+s) mod n
- (x,y)=[s]G + [t]P
- R=(e+x)mod n
- 計算R==?r
[s]G +[t]P的結果可以推導出等于[k]G 。有興趣可以嘗試一下。
加密
M為比特串
- 獲取隨機數 k
- (x1, y1) = [k]G
- S=[h]P //h為余因子
- C1=(x2,y2)= [k]P
- t=KDF(x2||y2,klen);//klen為M的長度。KDF是sm2的密鑰派生函數
- c2 = M+t
- C3 = Hash(x2||M||y2)
- C = C1||C2||C3
解密
C為加密后的結果,klen為密文中C2的長度
- C1 = C里面獲取 ,驗證C1是否滿足橢圓曲線。//C2長度確定,可以獲取C1內容。
- S=[h]C1,S為無窮點,退出。
- (x2,y2)=[d]C1
- t=KDF(m2||y2,klen)
- M' = C2+t
- u=Hash(x2||M'||y2), u ?= C3
- M`為明文