将公开密钥算法作为软件注冊算法的优点是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. Shell脚本编程

    1.linux中的变量 linux中的变量分为环境变量和普通变量,其中环境变量可以理解为全局变量,在所有shell的子程序中都可以引用,普通变量只能在自己的shell程序中使用,程序结束后变量无法保留 ...

  2. selenium webdriver——控制浏览器

    from selenium import webdriver import time def controlBrowser(): #启动浏览器 driver = webdriver.Firefox() ...

  3. Linux内存使用消耗高

    Linux系统下如果内存占用很高又找不到是被什么程序占用的,需要考虑下是否是SLAB的问题.SLAB是Linux操作系统的一种内存分配机制,可以使用下面命令来查看.例如: cat /proc/memi ...

  4. iOS中常见的自定义宏

    //字符串是否为空 #define kStringIsEmpty(str) ([str isKindOfClass:[NSNull class]] || str == nil || [str leng ...

  5. FreeBSD查看带宽占用情况,CPU,硬盘IO 虚拟内存等命令

    FreeBSD查看带宽占用情况,CPU,硬盘IO 虚拟内存等命令 来源 https://www.liurongxing.com/freebsd-tips.html 来源 http://blog.51c ...

  6. 百度地图API 根据地址查询经纬度

    html页面.引用上API: <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title> ...

  7. windows杀死进程netstat

    1.找到端口被占用情况 netstat -aon|findstr "9050" 协议    本地地址                     外部地址               ...

  8. 关于微信小程序并发数不能超过五个的问题

    wx.request 的最大请求数为5个,超过的部分就请求不到了 昨天遇到个问题,首页的请求数一共有9个,但是在有appid开发时竟然一直都没出错,直到我切到没appid的版本的时候才发现了这个问题. ...

  9. 如何清除全部的NSUserDefaults储存的数据。

    今天做项目遇到,如何清除全部的NSUserDefaults储存的数据. 方法1:找到所有的key然后remove掉 代码: [objc] view plain copy /** * 清除所有的存储本地 ...

  10. 【HDOJ5973】Game of Taking Stones(Java,威佐夫博弈)

    思路:有两堆石子,数量任意,可以不同.游戏开始由两个人轮流取石子. 游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的石子:二是可以在两堆中同时取走相同数量的石子. 最后把石子全部取完 ...