zoukankan      html  css  js  c++  java
  • 国家商用password(五)基于SM2的软件授权码生成及校验

    将公开密钥算法作为软件注冊算法的优点是Cracker非常难通过跟踪验证算法得到注冊机。以下。将介绍使用SM2国密算法进行软件注冊的方法。

    生成授权码

    1. 选择SM2椭圆曲线參数(P,a,b,N,Gx,Gy)
    2. 用随机数发生器产生随机数r∈[1,n-1]
    3. 计算椭圆曲线点R=[r]G=(XR,YR)
    4. 计算哈希值h=SM3(username ∥ XR ∥ YR)
    5. 计算序列号s≡(r - h * d) mod N。当中d为私钥,N为G点的阶
    6. 将s和h一起作为用户的授权码
    校验授权码
    1. 确定SM2椭圆曲线參数(P,a,b,N,Gx,Gy)
    2. 提取序列号s和哈希值h
    3. 计算点R≡([s]G + [h]Q) mod P。当中Q为公钥。P为素域元素数目
    4. 计算哈希值h'=SM3(username ∥ XR ∥ YR)
    5. 假设h'=h 则注冊成功;假设h'≠h。则注冊失败

    在国家商用password算法开放动态库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>
    /// SM2password算法注冊机生成授权码格式
    /// </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;
     }
    }
    


    
  • 相关阅读:
    js对象数组(JSON) 根据某个共同字段 分组
    一个 函数 用来转化esSearch 的range 条件
    关于 vuex 报错 Do not mutate vuex store state outside mutation handlers.
    android listview 重用view导致的选择混乱问题
    android SDK和ADT的更新
    Android中adb push和adb install的使用区别
    pycharm中添加扩展工具pylint
    su Authentication failure解决
    Putty以及adb网络调试
    有关android源码编译的几个问题
  • 原文地址:https://www.cnblogs.com/zhchoutai/p/6805131.html
Copyright © 2011-2022 走看看