基于C#实现简单离线注册码生成与验证

主要思路就是提供者持有密钥,通过RSA加密客户机标识或时间标识,再通过Base64加密成不太难看的注册码,然后分发给客户机。

客户机解Base64后,通过持有的公钥来验证注册码是否与本机标识或时间标识相符。

一、 生成公密钥

RSACryptoServiceProvider cryptor = new RSACryptoServiceProvider();
File.WriteAllText("PrivateKey.xml", cryptor.ToXmlString(true));
File.WriteAllText("PublicKey.xml", cryptor.ToXmlString(false));

为了方便长期保存这里就直接存入文件了。

为了避免客户机公钥丢失,我比较倾向于将公钥直接编译到验证程序中,但是这样也就意味着如果更换了密钥,老的验证程序就验不了新生成的注册码了。

二、 生成注册码

 static string CreateRegCode(string mac, DateTime date)
 {
   RSACryptoServiceProvider cryptor = new RSACryptoServiceProvider();
   cryptor.FromXmlString(File.ReadAllText("PrivateKey.xml"));
   string signature = String.Format("[{}][{}]", mac, date.ToString("yyyy-MM-dd"));
   byte[] regCodeBytes = cryptor.SignData(
     Encoding.UTF.GetBytes(signature),
     "SHA");
   return Convert.ToBaseString(regCodeBytes);
 }

这个方法是通过加密MAC和日期的组合来生成注册码,需要注意几点:

1.参数中的MAC是客户机的地址2.第四行的文件是上一步生成的密钥文件

3.由于只考虑验证,所以客户机还必须知道参数中的date

三、 验证注册码

static bool Verify(string regCode)
 {
   const string PUBLIC_KEY = "";
   try
   {
     RSACryptoServiceProvider cryptor = new RSACryptoServiceProvider();
     cryptor.FromXmlString(PUBLIC_KEY);
     byte[] signedData = Convert.FromBaseString(regCode);

     bool today = cryptor.VerifyData(
       Encoding.UTF.GetBytes(String.Format("[{}][{}]", DateTime.Now.ToString("yyyy-MM-dd"))),
       "SHA", signedData);
     bool machineToday = cryptor.VerifyData(
       Encoding.UTF.GetBytes(String.Format("[{}][{}]", MAC, DateTime.Now.ToString("yyyy-MM-dd"))),
       "SHA", signedData);
     bool forever = cryptor.VerifyData(
       Encoding.UTF.GetBytes(String.Format("[{}][{}]", MAC, Environment.MachineName)),
       "SHA", signedData);
     return today || machineToday || forever;
   }
   catch
   {
     return false;
   }
 }

这个方法验证了三种类型的注册码:当天可用、本机当天可用和永久可用。

需要注意:

1.第三行的公钥就是第一步的PublicKey.xml中的内容

2.十四和十七行的MAC是客户机的物理地址,至于怎么获取不是本文的重点,请各位看官自行百度

3.考虑到客户机填写的注册码有可能不是合法的Base64文本,需要捕获解析时异常

其实RSACryptoServiceProvider也提供了解密的方法,这样就可以验证更多种类的验证码了。

(0)

相关推荐

  • EditPlus注册码生成器(js代码实现)

    今天同事惊奇的告诉我,说找到个在线的EditPlus注册码生成器,我赶紧去看了看,还真是,在这里. exe的注册机病毒太多,纯js的在线注册机可就放心了. 作者是从别人的注册机反汇编然后找出算法的,更令我惊奇的是,这作者Demon竟然是搞法律的,才刚拿到法律职业资格证书,佩服. 主要的一个js函数是这样的: 复制代码 代码如下: function generate_editplus_regcode(username){ var list = [0,49345,49537,320,49921,96

  • asp.net 简易生成注册码(数字+大小写字母)

    如果有哪里看不懂的,请留言哦 生成随机码类:SigowayRandom.cs  复制代码 代码如下: using System; namespace RongYi.Model.Common { /// <summary> /// SigowayRandom 的摘要说明 /// </summary> public class SigowayRandom { #region 获取校验码 /// <summary> /// 获取校验码 /// </summary>

  • C#实现生成mac地址与IP地址注册码的两种方法

    本文实例讲述了C#实现生成mac地址与IP地址注册码的两种方法,分享给大家供大家参考之用.具体方法如下: 方法一: using System; using System.Management; using System.Security.Cryptography; using System.IO; using System.Collections.Generic; using System.Text; namespace xingming_reg { class Program { static

  • C#生成注册码的实例代码

    复制代码 代码如下: string t = DateTime.Now.Ticks.ToString(); t = DESKey.DESEncrypt(t, DESKey.DesKeyStr);            string[] strid = new string[t.Length];//            for (int i = 0; i < t.Length; i++)//把字符赋给数组            {                strid[i] = t.Subst

  • 基于C#实现简单离线注册码生成与验证

    主要思路就是提供者持有密钥,通过RSA加密客户机标识或时间标识,再通过Base64加密成不太难看的注册码,然后分发给客户机. 客户机解Base64后,通过持有的公钥来验证注册码是否与本机标识或时间标识相符. 一. 生成公密钥 RSACryptoServiceProvider cryptor = new RSACryptoServiceProvider(); File.WriteAllText("PrivateKey.xml", cryptor.ToXmlString(true)); F

  • 基于Java实现简单的时序数据压缩算法

    目录 背景 整数 Varint ZigZag Delta2 Simple8b 浮点数 有损压缩 无损压缩 字符串 标签型 非标签型 背景 今年在公司内部主导了两个的行情数据系统的构建,两者均使用到了常见的时序数据压缩算法. 这里简单总结一下过程中积累的一些经验. 让我们先来思考一个问题:压缩算法生效的前提是什么? 数据本身至少要符合以下两种特性其一: 数据存在冗余 数据符合特定的概率分布 在时序数据领域,数据冗余度与相似度较高,因此天生适合进行压缩. 但对于不同类型的数据,其所适用的压缩算法也大

  • 基于PHP实现简单的随机抽奖小程序

    一个抽奖小程序,概论可控,也可某个奖品在前端显示,而程序中根本不可能获得!把所有的概率x10后相加起来,新数组中每项的值等于它前几个的和加上它本身. 然后随即生成一个0到最大数之间的一个数,通过循环查看它属于那个区间,返回该区间的key. 代码如下 $prize = array( 1 => 3.5, //3.5%机率 2 => 2.5, 3 => 6, 4 => 2, 5 => 42, //42%机率 6 => 36, 7 => 2, 8 => 4, 9 =

  • 基于Java代码实现游戏服务器生成全局唯一ID的方法汇总

    在服务器系统开发时,为了适应数据大并发的请求,我们往往需要对数据进行异步存储,特别是在做分布式系统时,这个时候就不能等待插入数据库返回了取自动id了,而是需要在插入数据库之前生成一个全局的唯一id,使用全局的唯一id,在游戏服务器中,全局唯一的id可以用于将来合服方便,不会出现键冲突.也可以将来在业务增长的情况下,实现分库分表,比如某一个用户的物品要放在同一个分片内,而这个分片段可能是根据用户id的范围值来确定的,比如用户id大于1000小于100000的用户在一个分片内.目前常用的有以下几种:

  • 基于JS实现简单滑块拼图游戏

    成品效果 <body> <div id="game" style="position:relative"></div> </body> /** * js配置 */ var config = { width: 300, height: 300, img: "./img/fj.jpg", gameDom: document.getElementById("game"), row: 3

  • Pytorch实现基于CharRNN的文本分类与生成示例

    1 简介 本篇主要介绍使用pytorch实现基于CharRNN来进行文本分类与内容生成所需要的相关知识,并最终给出完整的实现代码. 2 相关API的说明 pytorch框架中每种网络模型都有构造函数,在构造函数中定义模型的静态参数,这些参数将对模型所包含weights参数的维度进行设置.在运行时,模型的实例将接收动态的tensor数据并调用forword,在得到模型输出之后便可以和真实的标签数据进行误差计算,并通过优化器进行反向传播以调整模型的参数.下面重点介绍NLP常用到的模型和相关方法. 2

  • 基于golang的简单分布式延时队列服务的实现

    一.引言 背景 我们在做系统时,很多时候是处理实时的任务,请求来了马上就处理,然后立刻给用户以反馈.但有时也会遇到非实时的任务,比如确定的时间点发布重要公告.或者需要在用户做了一件事情的X分钟/Y小时后,EG: "PM:我们需要在这个用户通话开始10分钟后给予提醒给他们发送奖励" 对其特定动作,比如通知.发券等等.一般我接触到的解决方法中在比较小的服务里都会自己维护一个backend,但是随着这种backend和server增多,这种方法很大程度和本身业务耦合在一起,所以这时需要一个延

  • 一种简单的ID生成策略: Mysql表生成全局唯一ID的实现

    生成全局ID的方法很多, 这里记录下一种简单的方案: 利用mysql的自增id生成全局唯一ID. 1. 创建一张只需要两个字段的表: CREATE TABLE `guid` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, `stub` char(1) NOT NULL DEFAULT '' COMMENT '桩字段,占坑的', PRIMARY KEY (`id`), UNIQUE KEY `uk_stub` (`stub`) -- 将 st

  • 如何基于opencv实现简单的数字识别

    目录 前言 要解决的问题 解决问题的思路 总结 前言 由于自己学识尚浅,不能用python深度学习来识别这里的数字,所以就完全采用opencv来识别数字,然后在这里分享.记录一下自己在学习过程中的一些所见所得和所想 要解决的问题 这是一个要识别的数字,我这里首先是对图像进行一个ROI的提取,提取结果就仅仅剩下数字,把其他的一些无关紧要的要素排除在外, 这是ROI图片,我们要做的就是识别出该照片中的数字, 解决问题的思路 1.先把这个图片中的数字分割,分割成为5张小图片,每张图片包含一个数字,为啥

  • 基于Pygame实现简单的贪吃蛇游戏

    目录 导入相关的包 设置屏幕大小以及基本参数 设置贪吃蛇的位置,以及移动的大小 绘制蛇 让蛇动起来 实现贪吃蛇拐弯 实现随机食物 吃食物 完整代码  导入相关的包 import pygame, sys, random from pygame.locals import * 设置屏幕大小以及基本参数 设置屏幕大小为400*400,mainClock = pygame.time.Clock()用来设置时间同步,不会根据计算机的运行来决定运行多少次, mainClock.tick(1) 一秒只会运行一

随机推荐