1.首先定义注册类RegisterEntity

    [Serializable]public class RegisterEntity{public string RegisterKey;public bool IsRegistered;public List<int> RegisterOrder;public DateTime RegisterDate;public DateTime ExpireDate;}

RegisterKey,注册码(序列号)

IsRegistered,是否已注册

RegisterOrder,注册顺序,由于打开注册码生成文件的时候会暴露Guid,这里作了一个简单的加密算法,打乱顺序后存入RegisterKey,而打乱后的顺序会存入这个List,

RegisterDate,注册日期

ExpireDate,过期日期

2.生成序列号

        private RegisterEntity GenerateRegisterKey(RegisterEntity registerEntity){StringBuilder fakeKey = new StringBuilder();string keyPart;List<int> registerOrder = new List<int>();int splitCount = 4;int currentOrder = 0;for (int i = 0; i < splitCount; i++){keyPart = Guid.NewGuid().ToString().Substring(0, 6).ToUpper();currentOrder = new Random().Next(1, splitCount + 1);while (registerOrder.Contains(currentOrder - 1)){Thread.Sleep(100);currentOrder = new Random().Next(1, splitCount + 1);}registerOrder.Add(currentOrder - 1);keyPart += "-";fakeKey.Append(keyPart);}fakeKey.Remove(fakeKey.Length - 1, 1);message = fakeKey.ToString();registerEntity.RegisterOrder = registerOrder;return registerEntity;}

这里随机生成了4个六位的Guid,用三个“-”连接起来就是序列号的格式了,打乱顺序用了Random方法,这样顺序也就只有电脑知道了,如果想复杂点可以把splitCount设置大一点,甚至可以把24个字母全部打乱,也就比较难破解了

3.加密

        private string EncipherRegisterKey(RegisterEntity registerEntity){string[] fakeKeyArgs = message.Split('-');string[] realKeyArgs = new string[4];for (int i = 0; i < fakeKeyArgs.Length; i++){realKeyArgs[registerEntity.RegisterOrder[i]] = fakeKeyArgs[i];}StringBuilder realKey = new StringBuilder();string keyPart = string.Empty;for (int i = 0; i < realKeyArgs.Length; i++){keyPart = realKeyArgs[i].ToString() + "-";realKey.Append(keyPart);}realKey.Remove(realKey.Length - 1, 1);return realKey.ToString();}

实际上加密应该包括第2步,这里只是把序列号按照随机打乱的顺序重新组合了一下

4.把生成的Key写入文件

        public string GenerateRegisterKeyToBinFile(string registerFileName){message = string.Empty;try{registerEntity = new RegisterEntity();GenerateRegisterKey(registerEntity);// encipher 加密registerEntity.RegisterKey = EncipherRegisterKey(registerEntity);registerEntity.IsRegistered = false;IFormatter formatter = new BinaryFormatter();Stream stream = new FileStream(registerFileName, FileMode.Create,FileAccess.Write, FileShare.None);formatter.Serialize(stream, registerEntity);stream.Close();}catch (Exception ex){message = "Error: " + ex.Message;return message;}return message;}

在这里,每次生成新Key的时候由于会覆盖旧文件,而验证的时候是读取Key文件进行比对,所以在这里把IsRegistered设成了false

5.解密

        private string DecipherRegisterKey(RegisterEntity registerEntity){string[] realKeyArgs = registerEntity.RegisterKey.Split('-');string[] fakeKeyArgs = new string[4];if (!Utility.isNullOrEmptyLst(registerEntity.RegisterOrder) && !Utility.isNullOrEmpty(realKeyArgs)){for (int i = 0; i < realKeyArgs.Length; i++){fakeKeyArgs[i] = realKeyArgs[registerEntity.RegisterOrder[i]];}}StringBuilder decipherKey = new StringBuilder();string keyPart = string.Empty;for (int i = 0; i < fakeKeyArgs.Length; i++){keyPart = fakeKeyArgs[i].ToString() + "-";decipherKey.Append(keyPart);}decipherKey.Remove(decipherKey.Length - 1, 1);return decipherKey.ToString();}

细心的朋友会发现,解密其实和加密差不多,只是fakeKeyArgs和realKeyArgs的顺序换下,是的,验证Key的时候是比较fakeKey而不是真正存储在文件里的realKey

6.验证Key的有效性以及是否过期

        public bool CheckRegister(string registerFileName){RegisterEntity registerEntity = new RegisterEntity();try{string dBFilePath = string.Format("{0}\\{1}", Directory.GetCurrentDirectory(), registerFileName);if (File.Exists(dBFilePath)){IFormatter formatter = new BinaryFormatter();Stream stream = new FileStream(registerFileName, FileMode.Open,FileAccess.Read, FileShare.Read);registerEntity = (RegisterEntity)formatter.Deserialize(stream);stream.Close();if (registerEntity.IsRegistered == true && registerEntity.ExpireDate < DateTime.Today){registerEntity.IsRegistered = false;formatter = new BinaryFormatter();stream = new FileStream(registerFileName, FileMode.Create,FileAccess.Write, FileShare.None);formatter.Serialize(stream, registerEntity);stream.Close();}}}catch (Exception ex){return false;}return registerEntity.IsRegistered;}

是指打开软件的时候识别序列号是否已经过期或者是否已经注册

7.注册并验证

        public bool RegisterKey(string inputKey, string registerFileName){RegisterEntity registerEntity = new RegisterEntity();try{string dBFilePath = string.Format("{0}\\{1}", Directory.GetCurrentDirectory(), registerFileName);if (File.Exists(dBFilePath)){IFormatter formatter = new BinaryFormatter();Stream stream = new FileStream(registerFileName, FileMode.Open,FileAccess.Read, FileShare.Read);registerEntity = (RegisterEntity)formatter.Deserialize(stream);stream.Close();string fakeKey = DecipherRegisterKey(registerEntity);if (inputKey == fakeKey){registerEntity.IsRegistered = true;registerEntity.RegisterDate = DateTime.Today;registerEntity.ExpireDate = registerEntity.RegisterDate.AddDays(30);//Enable Register Keyformatter = new BinaryFormatter();stream = new FileStream(registerFileName, FileMode.Create,FileAccess.Write, FileShare.None);formatter.Serialize(stream, registerEntity);stream.Close();}}}catch (Exception ex){return false;}return registerEntity.IsRegistered;}

输入序列号后,注册,验证序列号是否有效,如果有效,则激活软件

转载于:https://www.cnblogs.com/ceee/p/4932585.html

[Serializable]的应用--注册码的生成,加密和验证相关推荐

  1. Php公钥加密data是空,php 生成加密公钥加密私钥实例详解

    php 生成加密公钥加密私钥实例详解 生成公钥私钥 win下必须要openssl.cof支持 liunx一般已自带安装 $config = array( //"digest_alg" ...

  2. php把数据生成mxl,php如何生成加密公钥以及加密私钥的代码案例分享

    这篇文章主要介绍了php 生成加密公钥加密私钥实例详解的相关资料,需要的朋友可以参考下 php 生成加密公钥加密私钥实例详解 生成公钥私钥 win下必须要openssl.cof支持 liunx一般已自 ...

  3. JavaScript加密/解密与OpenAI的对接:生成加密对话的ChatGPT 4.0应用

    首先,我们来看一个简单的JavaScript加密算法的示例,该算法将输入的字符串每个字符的ASCII值加上1,并返回一个新的字符串.以下是加密函数的代码: javascriptCopy codefun ...

  4. Java常见应用——Json,二维码生成,加密解密应用

    Java常见应用--Json,二维码生成,加密解密应用 一.JSON 1.下载json架包,json官网:json.org 2.将Map/JavaBean/String转化成json对象,只需要使用J ...

  5. 使用node加密解密数据,创建Hash/HMAC,并生成签名与验证签名

    1.数据加密与解密 主要使用了node的crypto模块的Cipher与Decipher类来加密解密,加密与解密的方法主要有以下几种: 1.1 使用Cipher与Decipher对象作为流来加密解密 ...

  6. 添加盐值生成加密密码

    ** 工具包 ** /*** 功能描述:获取指定位数的随机字符串** @param: [n]* @return: java.lang.String*/public static String getR ...

  7. EditPlus注册码在线生成

    在线网址:EditPlus注册码在线生成工具  ←←←点击链接 此在线生成页面包含Editplus注册码.MyEclipse注册码.Intellij Idea注册码 随意输入用户名,点击生成注册码按钮 ...

  8. python判断网页密码加密方式_Python模拟网页中javascript加密与验证的相关处理

    在做网络爬虫的过程中你是否一些在这方面做的很好的网站,你向知道他是通过哪些相关的操作做出这么好的网站,以下就是文章的相关内容的具体介绍,希望你浏览完下面的内容会有所收获.Python模拟网页的java ...

  9. java sm3国密算法加密、验证工具类

    java sm3国密算法加密.验证工具类 说明 maven依赖 完整代码 测试 说明 由于本人并不专于算法和密码学,所以如果发现工具类存在问题或者可优化地方,欢迎评论处提出. 工具类也可以直接使用封装 ...

  10. 技能学习:学习使用php(tp6框架) + vue.js,开发前端全栈网站-5.用户登录,密码的bcrypt(hash)加密与验证

    技能学习:学习使用php(tp6框架) + vue.js,开发前端全栈网站-5.用户登录,密码的bcrypt(hash)加密与验证 技能学习:学习使用php(tp6框架) + vue.js,开发前端全 ...

最新文章

  1. linux下批量修改文件名精彩解答案例分享
  2. 在华为写了 13 年代码,都是宝贵的经验
  3. python进阶(小白也能看懂)——Map、Filter、Reduce
  4. Struts 2框架创建的第一个项目
  5. 原创第13篇~while循环
  6. vue element Form-Item prop
  7. python 类和对象 有必要学吗_Python学习——对类和对象的初步理解,初识,与
  8. python中的缩进是长度统一吗_python缩进长度是否统一
  9. 根据输入时间判断年龄是否在18~68周岁之间
  10. 阿里云短信验证码接口
  11. 微信开放平台创建移动应用-必过
  12. ESP32 天气预报 彩屏
  13. 单片机系统不稳定情况
  14. 通读JavaScript红皮书(第二三章)
  15. matlab 画xos函数,振荡积分的数值计算与Matlab实现
  16. 【x86架构】SMM
  17. Go语言实现AI五子棋智能算法
  18. 【机器学习】“冷启动” 问题
  19. 页面重定向erro-miss
  20. 微信小程序的基础标签及使用(入门)

热门文章

  1. 封装数据库增删该通用方法
  2. 【转】Tcl/Tk 漫谈
  3. [转]NVIDIA/ATI显卡后缀命名大盘点
  4. 数据库入门-pymysql模块的使用
  5. poj 2409 Let it Bead【polya定理+burnside引理】
  6. python计算平面的法向-利用协方差矩阵求解特征值和特征向量
  7. centos7 源码安装redis
  8. git遇到的问题解决方案
  9. java初级开发一系列的工具安装配置
  10. CrtmpServer 接收推送视频流 注册流基本流程