SM2算法在數(shù)字簽名中的應用

數(shù)字簽名是一種類似寫在紙上的普通的物理簽名,但是使用了公鑰加密領(lǐng)域的技術(shù)來實現(xiàn)的,用于鑒別數(shù)字信息的方法。目前主流的簽名算法有RSA數(shù)字簽名算法和DSA數(shù)字簽名算法,而國密算法SM2也同樣可以用作于數(shù)字簽名算法。下面我們就來了解一下SM2算法在數(shù)字簽名中的應用。

ECDSA數(shù)字簽名算法

首先,SM2算法是一種基于橢圓曲線的密碼算法,與ECC算法類似。而在數(shù)字簽名領(lǐng)域中,DSA算法結(jié)合ECC,稱為ECDSA數(shù)字簽名算法。

ECDSA

對于橢圓曲線密碼算法而言,最重要的是選擇一條命名曲線,包括幾個重要的參數(shù):p、a、b、G(x,y)和n。而在ECDSA算法中,有三個參數(shù)很重要:

  1. 命名曲線。
  2. G,橢圓曲線的基點。
  3. n,相當于G基點的打點次數(shù)。

ECDSA簽名算法密鑰對的生成為:

  • 選擇一個隨機數(shù)作為私鑰d, 1 < d < n -1
  • 基于私鑰生成公鑰,P(x, y) = d * G(x, y)

簽名生成

下面的步驟中,M是消息,HASH(M)是對消息進行摘要運算。d為私鑰,P為公鑰。

  1. 生成一個隨機數(shù)k,1 < k < n -1
  2. 計算(x, y) = k * G
  3. 計算r = x mod n
  4. 計算s = (k**-1 * (HASH(M) + d*r)) mod n
  5. 得到簽名值(r, s)。

驗證簽名

  1. 將簽名轉(zhuǎn)化為兩個數(shù)r和s,假如r和s小于1或者大于n-1,驗證直接失敗。
  2. 計算c = (s)**-1 mod n
  3. 計算u1 = ((HASH(M)) * c) mod n
  4. 計算u2 = ((r) * c) mod n
  5. 計算(x, y) = u1 * G + u2 * P
  6. 如果r = x mod n,則簽名驗證成功,否則失敗。

SM2數(shù)字簽名算法

雖然SM2也是一種橢圓曲線(EC)密碼算法,但它和標準ECDSA的流程并不完全相同。

SM2

簽名生成

設待簽名的消息為M,為了獲取消息M的數(shù)字簽名(r,s),作為簽名者的用戶A應實現(xiàn)以下運算步驟:

  1. 置M=ZA||M;
  2. 計算e=Hv(M),將e的數(shù)據(jù)類型轉(zhuǎn)換為整數(shù);
  3. 用隨機數(shù)發(fā)生器產(chǎn)生隨機數(shù)k∈[1,n-1];
  4. 計算橢圓曲線點(x1,y1)=[k]G,將x1的數(shù)據(jù)類型轉(zhuǎn)換為整數(shù);
  5. 計算r=(e+x1)modn,若r=0或r+k=n則返回第3步;
  6. 計算s=((1+dA)-1·(k-r·dA))mod n,若s=0則返回第3步;
  7. 將r、s的數(shù)據(jù)類型轉(zhuǎn)換為字節(jié)串,消息M的簽名為(r,s)。

簽名驗證

  1. 檢驗r'∈[1,n-1]是否成立,若不成立則驗證不通過;
  2. 檢驗s'∈[1,n-1]是否成立,若不成立則驗證不通過;
  3. 置M'=ZA||M';
  4. 計算e'=Hv(M'),將e'的數(shù)據(jù)類型轉(zhuǎn)換為整數(shù);
  5. 將r'、s'的數(shù)據(jù)類型轉(zhuǎn)換為整數(shù),計算t=(r'+s')modn,若t=0,則驗證不通過;
  6. 計算橢圓曲線點(x1',y1')=[s']G+[t]PA;
  7. 將x1'的數(shù)據(jù)類型轉(zhuǎn)換為整數(shù),計算R=(e'+x1')modn,檢驗R=r'是否成立,若成立則驗證通過;否則驗證不通過。

SM2

SM2數(shù)字簽名算法和ECDSA數(shù)字簽名算法的不同

  1. 對消息的處理不同,國密簽名算法對消息進行了處理,然后才計算摘要。其中 ZA?的計算涉及到命名曲線參數(shù)的a、b、G、P。
  2. SM2數(shù)字簽名算法簽名生成的5、6步的運算和ECDSA的第3、4步不一樣。
  3. 國密簽名過程中,如果出現(xiàn)不合法的值,需要返回到第3步,重新生成隨機數(shù),直到值合法。

免責聲明:素材源于網(wǎng)絡,如有侵權(quán),請聯(lián)系刪稿。