一.界面如下

(1)生成注册码

输入注册码有效期(单位可选择小时、天、月、年)-> 输入机器码 -> 生成注册码

(2)验证注册码

自动读取本地机器码 -> 输入注册码 -> 验证注册码

二.主要代码块如下

(1)生成本机机器码(cpuID+磁盘+Mac地址)

/// <summary>
/// 取本机机器码
/// </summary>
public static string GetMachineCode()
{//CPU信息string cpuInfo = GetMD5Value(GetCpuID() + typeof(string).ToString());if (cpuInfo.Equals("UnknowCpuInfo")) return null;//磁盘信息string diskInfo = GetMD5Value(GetDiskID() + typeof(int).ToString());if (diskInfo.Equals("UnknowDiskInfo")) return null;//MAC地址string macInfo =  GetMD5Value(GetMacByNetworkInterface() + typeof(double).ToString());if (macInfo.Equals("UnknowMacInfo")) return null;//返回机器码return GetNum(cpuInfo, 8) + GetNum(diskInfo, 8) + GetNum(macInfo, 8);
}/// <summary>
/// 取MD5
/// </summary>
/// <param name="value">要加密的字符串</param>
public static string GetMD5Value(string value)
{MD5 md5 = new MD5CryptoServiceProvider();byte[] targetData = md5.ComputeHash(Encoding.Unicode.GetBytes(value));string resString = null;for (int i = 0; i < targetData.Length; i++){resString += targetData[i].ToString("x");}return resString;
}/// <summary>
/// 取数字
/// </summary>
/// <param name="md5"></param>
/// <param name="len"></param>
/// <returns></returns>
public static string GetNum(string md5, int len)
{Regex regex = new Regex(@"\d");MatchCollection listMatch = regex.Matches(md5);string str = "";for (int i = 0; i < len; i++){str += listMatch[i].Value;}while (str.Length < len){//不足补0str += "0";}return str;
}/// <summary>
/// 取CPU序列号
/// </summary>
public static string GetCpuID()
{try{string cpuInfo = "";ManagementClass mc = new ManagementClass("Win32_Processor");ManagementObjectCollection moc = mc.GetInstances();foreach (ManagementObject mo in moc){cpuInfo = mo.Properties["ProcessorId"].Value.ToString();}moc.Dispose();mc.Dispose();return cpuInfo;}catch{return "UnknowCpuInfo";}
}/// <summary>
/// 取硬盘序列号
/// </summary>
public static string GetDiskID()
{try{string HDid = "";ManagementClass mc = new ManagementClass("Win32_DiskDrive");ManagementObjectCollection moc = mc.GetInstances();foreach (ManagementObject mo in moc){HDid = (string)mo.Properties["Model"].Value;}moc.Dispose();mc.Dispose();return HDid;}catch{return "UnknowDiskInfo";}
}/// <summary>
/// 获取本机MAC地址
/// </summary>
public static string GetMacByNetworkInterface()
{try{NetworkInterface[] interfaces = NetworkInterface.GetAllNetworkInterfaces();foreach (NetworkInterface ni in interfaces){return BitConverter.ToString(ni.GetPhysicalAddress().GetAddressBytes());}return "UnknowMacInfo";}catch (Exception){return "UnknowMacInfo";}
}

(2)根据机器码生成注册码

//加密key
public static string machineCodeEncryptKey = "9832";/// <summary>
/// 根据机器码产生注册码
/// </summary>
/// <param name="machineCode">机器码</param>
/// <param name="overTime">到期时间</param>
/// <returns>注册码</returns>
public static string CreateRegisterCode(string machineCode, DateTime overTime)
{//格式:机器码&过期时间&注册时间var finalCode = machineCode + "&" + overTime.ToString("s") + "&" + DateTime.Now.ToString("s");//加密return ToEncryptString(machineCodeEncryptKey, finalCode);
}/// <summary>
/// 字符串加密
/// </summary>
/// <param name="key">加密key</param>
/// <param name="str">要加密的字符串</param>
public static string ToEncryptString(string key, string str)
{try{//将密钥字符串转换为字节序列var P_byte_key = Encoding.Unicode.GetBytes(key);//将字符串转换为字节序列var P_byte_data = Encoding.Unicode.GetBytes(str);//创建内存流对象MemoryStream mStream = new MemoryStream();{using (CryptoStream P_CryptStream_Stream = new CryptoStream(mStream, new DESCryptoServiceProvider().CreateEncryptor(P_byte_key, P_byte_key), CryptoStreamMode.Write)){//向加密流中写入字节序列P_CryptStream_Stream.Write(P_byte_data, 0, P_byte_data.Length);//将数据压入基础流P_CryptStream_Stream.FlushFinalBlock();//从内存流中获取字节序列var res = mStream.ToArray();P_CryptStream_Stream.Dispose();mStream.Dispose();return Convert.ToBase64String(res);}}}catch (CryptographicException ce){throw new Exception(ce.Message);}
}

(3)本地机器码验证注册码(授权时间校验)

//加密key
public static string machineCodeEncryptKey = "9832";/// <summary>
/// 检查注册码(校验本地机器码)
/// </summary>
/// <param name="registerCode">注册码</param>
/// <param name="overTime">返回过期时间</param>
/// <param name="registerTime">返回注册时间</param>
/// <returns>机器码与注册码匹配结果</returns>
public static bool CheckRegister(string registerCode, ref DateTime overTime, ref DateTime registerTime)
{try{var finalCodeList = ToDecryptString(machineCodeEncryptKey, registerCode).Split('&');if (finalCodeList.Length == 3){DateTime.TryParse(finalCodeList[1], out overTime);DateTime.TryParse(finalCodeList[2], out registerTime);//获取本地机器码var machineCode = GetMachineCode();return machineCode != null && (finalCodeList[0] == machineCode);}else{return false;}}catch{return false;}
}/// <summary>
/// 字符串解密
/// </summary>
/// <param name="key">加密key</param>
/// <param name="str">要解密的字符串</param>
public static string ToDecryptString(string key, string str)
{try{//将密钥字符串转换为字节序列var P_byte_key = Encoding.Unicode.GetBytes(key);//将加密后的字符串转换为字节序列var P_byte_data = Convert.FromBase64String(str);//创建内存流对象并写入数据,创建加密流对象CryptoStream cStream = new CryptoStream(new MemoryStream(P_byte_data), new DESCryptoServiceProvider().CreateDecryptor(P_byte_key, P_byte_key), CryptoStreamMode.Read);//创建字节序列对象var tempDate = new byte[200];//创建内存流对象MemoryStream mStream = new MemoryStream();//创建记数器int i = 0;//使用while循环得到解密数据while ((i = cStream.Read(tempDate, 0, tempDate.Length)) > 0){//将解密后的数据放入内存流mStream.Write(tempDate, 0, i);}var res = Encoding.Unicode.GetString(mStream.ToArray());mStream.Dispose();cStream.Dispose();return res;}catch (CryptographicException ce){throw new Exception(ce.Message);}
}

三.源代码网盘地址

链接:https://pan.baidu.com/s/1thozg6dQTLHstHrMSEhuOQ 
提取码:0304

C# 根据机器码生成+验证注册码简单实现demo相关推荐

  1. 生成和验证注册码的基本思路

    大多数情况下,我们开发一款小软件,都会有如下需求: 想限制试用版的使用次数.并且当注册后,怎样才能一个注册码对应唯一一台电脑,不能重复使用注册码,在不同电脑上注册. 基本思路 1.当程序首次运行时,在 ...

  2. C# 生成软件注册码

    C# 生成软件注册码 今天早上,花了一个早上弄了个生成机器码和注册码的Demo,通过生成的注册码里面包含时间信息,保证了注册码在使用后的指定时间后失效 由于数学不行所以写的比较简单,ok 上代码吧 产 ...

  3. msfvenom生成木马的简单利用

    msfvenom生成木马的简单利用 1.简介 本篇文章将会用msfvenom生成一个windows下可执行木马exe的文件,用kali监听,靶机win10运行木马程序,实现控制靶机win10. 2.实 ...

  4. 手动生成MyEclipse注册码及序列号(源代码)

    本文转自:  手动生成MyEclipse注册码及序列号http://visionsky.blog.51cto.com/733317/340855 好多朋友在找myeclipse的注册码,下面介绍种 ...

  5. 登录功能中发送邮箱验证的简单使用

    登录功能中发送邮箱验证的简单使用 java开发中常用的邮箱相关的就是给邮箱发送验证码,发送验证码在java中使用javamail,它提供了一套发送和接收功能的标准,支持协议:smtp,pop3,ima ...

  6. 教你用支付宝一键生成证件照,简单又实用,效果比照相馆的好太多

    教你用支付宝一键生成证件照,简单又实用,效果比照相馆的好太多 在工作和生活中,我们有很多时候需要用到自己的证件照,去照相馆拍照有时候不方便还麻烦,拍摄的效果自己不满意,今天来跟大家分享一下如何用支付宝 ...

  7. xcode江湖录-第04章 风水宝地--界面生成器之StoryBoard简单示例 与 约束

    第04章风水宝地--界面生成器之StoryBoard简单示例 ??如何设置转场动画?? ??如何在参与到转场动作中?? ??如何让页面跳转到自定义VC?? ??如何设置自定义跳转模式?? ??如何用S ...

  8. 两个简单的Demo示例向读者展示Flash和ASP.NET交互原理以及过程

    ASP.NET与FLASH交互学习了ASP.NET的基础知识之后,终于等到学习交互的时候了.请大家和我一起来进行让人激动的交互吧!本章我将用两个简单的Demo示例向读者展示Flash和ASP.NET交 ...

  9. c# MEF框架(一 MEF简介及简单的Demo)

    转自:http://www.cnblogs.com/yunfeifei/p/3922668.html 在文章开始之前,首先简单介绍一下什么是MEF,MEF,全称Managed Extensibilit ...

最新文章

  1. 云计算架构设计6大原则,你遵循了吗?
  2. PHP使用swoole来实现实时异步任务队列
  3. 如何使用SAP云平台的Notification服务给Android应用推送通知消息
  4. dtm文件生成等高线 lisp_南方cass如何用图面高程点生成等高线
  5. 回归指令_用一条指令在新款 Mac 上找回经典的开机启动声
  6. Python画各种 3D 图形Matplotlib库
  7. (转)Openlayers 2.X加载天地图
  8. php控制台输入输出
  9. 【深入理解JVM】引用,句柄,指针分别是什么?
  10. NoSQL数据库之国产开源产品:SequoiaDB 分析前言
  11. Android ListView
  12. 一网打尽Mac上的高效工具 - 系统工具篇(附演示视频)
  13. vba字典重复key_VBA字典技术整理
  14. 20210729 线性增长条件和全局Lipschitz条件的关系
  15. Kbps、KBps是什么意思?网络下载速度单位换算
  16. Ubuntu系统清理工具
  17. 题解 CF722E 【Research Rover】
  18. java语言基础总结ppt_我的java基础知识总结ppt
  19. 通过css实现单选按钮效果
  20. Java复习之抽象类和接口

热门文章

  1. 提升 PPT 逼格的秘诀:善用圆角矩形
  2. iphone的heic图像转换无损jpg,png方法
  3. 小米4 第三方re奇兔_小米手机推出心率检测功能,升级至 MIUI 12即可使用
  4. SQL结果合计与分列
  5. 【数据下载】使用DownThemAll批量下载网站上的文件
  6. 软件设计师备考资料及策略
  7. android壁纸软件代码,Flutter开源项目——Android免费壁纸应用
  8. BZOJ1034 [ZJOI2008]泡泡堂BNB 【贪心】
  9. php 数组如何添加元素,php数组添加元素
  10. Python编写打飞机小游戏