将公开密钥算法作为软件注冊算法的优点是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;
}
}



国家商用password(五)基于SM2的软件授权码生成及校验的更多相关文章

  1. 基于Zxing的二维码的二维码扫描之横屏扫描

    最近项目条码扫描要改为横屏,网上所搜了一下,然后发现我写的需要改动几行代码就可以了,还是很给力的. 如未查看之前的代码,请移步: 基于Zxing的二维码生成和二维码扫描 修改下面写代码就可以实现横屏条 ...

  2. [转]基于Protel DXP软件的PCB高级编辑技巧大全

    来源:基于Protel DXP软件的PCB高级编辑技巧大全 一.放置坐标指示 放置坐标指示可以显示出PCB板上任何一点的坐标位置. 启用放置坐标的方法如下:从主菜单中执行命令 Place/Coordi ...

  3. PfSense基于BSD的软件防火墙的安装、配置与应用

    PfSense基于BSD的软件防火墙的安装.配置与应用 PfSense是一个FreeBSD下的免费开源的防火墙和路由器软件,他为了在X86平台上面建立一个高集成性的防火墙项目,下面就为大家展示如何配置 ...

  4. 【小梅哥FPGA进阶教程】第九章 基于串口猎人软件的串口示波器

    九.基于串口猎人软件的串口示波器 1.实验介绍 本实验,为芯航线开发板的综合实验,该实验利用芯航线开发板上的ADC.独立按键.UART等外设,搭建了一个具备丰富功能的数据采集卡,芯航线开发板负责进行数 ...

  5. 基于Azure的软件部署和开发系列沙龙

    活动简介: Azure是一种灵活和支持互操作的平台,它可以被用来创建云中运行的应用或者通过基于云的特性来加强现有应用.它开放式的架构给开发者提供了Web应用.互联设备的应用.个人电脑.服务器.或者提供 ...

  6. ABSD 基于架构的软件设计方法方法简介(摘抄)

    ABSD(Architecture-Based Software Design)基于架构的软件设计方法 有三个基础: 第一个基础是功能分解.在功能分解中,ABSD方法使用已有的基于模块的内聚和耦合技术 ...

  7. GAN网络之入门教程(五)之基于条件cGAN动漫头像生成

    目录 Prepare 在上篇博客(AN网络之入门教程(四)之基于DCGAN动漫头像生成)中,介绍了基于DCGAN的动漫头像生成,时隔几月,序属三秋,在这篇博客中,将介绍如何使用条件GAN网络(cond ...

  8. 软件授权协议有什么作用,例如GPL、Apache License、CDDL、EPL这些协议有什么区别?

    1.授权协议有什么作用:授权协议就是授予你使用或修改软件等权利,由于软件受到著作权保护,未经授权使用即是侵犯著作权,属于违法行为,所以同意或签署软件授权协议是你使用或修改软件的前提条件.既然是授权协议 ...

  9. H5类似易企秀/编辑器/页面制作/开发/生成工具/软件/源码/授权

    代码地址如下:http://www.demodashi.com/demo/14960.html 项目简介 H5DS (HTML5 Design software) 这是一款基于WEB的 H5制作工具. ...

随机推荐

  1. PHP 获取客户端用户 IP 地址

    一般情况下可以使用以下代码获取到用户 IP 地址 echo 'User IP - '.$_SERVER['REMOTE_ADDR']; // 服务器在局域网的话,那么显示的则是内网IP .// 如果服 ...

  2. Python 拓展之迭代器

    写在之前 今天来讲讲「迭代器」的内容,其实已经拖了好多天了,感觉再不写就要忘记了.「迭代」相信对你来说已经不陌生了,我前面曾经专门用一篇文章来讲,如果你已经没有什么印象的话,就再点进去看看(零基础学习 ...

  3. nyoj 题目19 擅长排列的小明

    擅长排列的小明 时间限制:1000 ms  |  内存限制:65535 KB 难度:4   描述 小明十分聪明,而且十分擅长排列计算.比如给小明一个数字5,他能立刻给出1-5按字典序的全排列,如果你想 ...

  4. C#控制台程序读取项目中文件路径

    //使用appdomain获取当前应用程序集的执行目录 string dir = AppDomain.CurrentDomain.BaseDirectory; //使用path获取当前应用程序集的执行 ...

  5. 【转】unity 移动物体到指定位置的四种方法

    http://blog.csdn.net/lcy0221/article/details/44040739 方法1:使用Vector3.MoveTowards </pre><pre  ...

  6. Sql数据表中的关系

  7. springdata jpa

    (转自:http://www.cnblogs.com/ityouknow/p/5891443.html) 首先了解JPA是什么? JPA(Java Persistence API)是Sun官方提出的J ...

  8. Ubuntu下建立Pycharm快捷方式

    修改 Exec, Icon 路径,将文件保存 pycharm.desktop,拖到unity侧边栏 [Desktop Entry]Categories=Development;Comment[zh_C ...

  9. 共鸣(resonance)

    共鸣(resonance) 题目描述 GHQ通过在24区引起基因组共鸣,从而引发了第二次失落的圣诞. 24区的地图可以视为一个二维平面.GHQ在24区布置了m架发射塔,而葬仪社也建立了n个据点.要阻止 ...

  10. Java代码添加背景音乐

    太心塞!弄了很久才终于把Java添加背景音乐实现了.不过还是很Happy! 这次介绍的办法,是只要一打开Java Application,便可直接听到背景音乐.代码保存,方便以后再次利用. packa ...