標籤:sm2 sm3 sm4 國家商用密碼
將公開密鑰演算法作為軟體註冊演算法的好處是Cracker很難通過跟蹤驗證演算法得到註冊機。下面,將介紹使用SM2國密演算法進行軟體註冊的方法。
產生授權碼
- 選擇SM2橢圓曲線參數(P,a,b,N,Gx,Gy)
- 用隨機數發生器產生隨機數r∈[1,n-1]
- 計算橢圓曲線點R=[r]G=(XR,YR)
- 計算雜湊值h=SM3(使用者名稱 ∥ XR ∥ YR)
- 計算序號s≡(r - h * d) mod N,其中d為私密金鑰,N為G點的階
- 將s和h一起作為使用者的授權碼
校正授權碼
- 確定SM2橢圓曲線參數(P,a,b,N,Gx,Gy)
- 提取序號s和雜湊值h
- 計算點R≡([s]G + [h]Q) mod P,其中Q為公開金鑰,P為素域元素數目
- 計算雜湊值h‘=SM3(使用者名稱 ∥ XR ∥ YR)
- 如果h‘=h 則註冊成功;如果h‘≠h,則註冊失敗
在國家商用密碼演算法開放動態庫OpenSM.dll的SM2類中已整合授權碼的產生和驗證方法。對應的成員函數為:
/// <summary>/// 產生授權碼/// </summary>/// <param name="userId">使用者註冊資訊</param>/// <param name="PrivateKey">私密金鑰</param>/// <returns>授權碼</returns> /// <remarks>注意:對於相同的註冊資訊,每次產生的授權碼並不相同</remarks>public ECLicenseKey LicenseKeyMaker(byte[] userId, BigInteger PrivateKey);/// <summary>/// 產生授權碼/// </summary>/// <param name="userId">使用者註冊資訊</param>/// <param name="PrivateKey">私密金鑰</param>/// <param name="r">隨機數,其值在[1, N-1],N為G點的階</param>/// <returns>授權碼</returns>/// <remarks>注意:對於相同的註冊資訊和相同的r,每次產生的授權碼一致</remarks>public ECLicenseKey LicenseKeyMaker(byte[] userId, BigInteger PrivateKey, BigInteger r);/// <summary>/// 校正授權碼/// </summary>/// <param name="userId">使用者註冊資訊</param>/// <param name="RegisterCode">註冊碼</param>/// <param name="PublicKey">公開金鑰</param>/// <returns>/// true:校正通過/// fasle:校正失敗/// </returns>public bool LicenseKeyVerifier(byte[] userId, ECLicenseKey RegisterCode, ECPoint PublicKey);
ECLicenseKey類定義如下:
/// <summary>/// SM2密碼演算法註冊機產生授權碼格式/// </summary>public class ECLicenseKey{ public readonly BigInteger mKey; public readonly BigInteger mHash; /// <summary> /// 建構函式 /// </summary> /// <param name="key">授權碼</param> /// <param name="hash">雜湊值</param> public ECLicenseKey(BigInteger key, BigInteger hash) { this.mKey = key; this.mHash = hash; }}
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
國家商用密碼(五)基於SM2的軟體授權碼產生及校正