C#程序加密与解密的流程步骤
作者:Big_潘大师
文章介绍了一种基于CPU和硬盘编码的C#程序加密方法,包括生成、验证和保存注册码的过程,以及如何在用户软件和解密程序中实现这一功能,文中通过代码示例和图文讲解的非常详细,需要的朋友可以参考下
一、加密程序功能介绍
1、加密用途
对软件权限加密可适用于设备催付款,限制使用日期。
2、功能
一台机器一个注册码,每个码都不一样。加密后客户尝试修改电脑时间或者更换电脑均无效。
3、程序说明
Demo程序示例分为两部分,用户程序部分加密程序、一个是后台权限注册解密程序。
4、加密过程
读取电脑CPU编码、读取电脑硬盘编码,设置限定日期,生成注册码。注册码经过MD5加密,写入注册表、写入硬盘本地。(删除或者修改注册表中或者硬盘中的任何一个文件都将导致用户软件无法使用)
5、授权的注册文件保存方式
授权的注册码经过MD5加密技术加密后分别存储在注册表和本地硬盘中,经过MD5加密后的数据无法进行逆向解密。
在授权使用时间天数范围内,用户不能修改该注册码或者删除文件,否则导致授权损坏用户软件无法使用软件。
二、加密程序使用步骤
1、步骤一
在用户程序中,将机器码复制拷贝到解密程序中,设置授权使用天数。
(如果是永久授权使用,则授权天数输入36500即可)
2、步骤二
解密程序中生成注册码
3、步骤三
将解密程序中生成的注册码复制到用户软件中,进行注册
4、步骤四
注册后重新启动用户程序,软件生效
三、核心代码说明
1、获取电脑CPU 信息
每个CPU信息出厂后都是独立且唯一的
/// <summary> /// 获取电脑CPU信息的方法 /// </summary> /// <returns></returns> public static string GetCpuId() { ManagementClass mc = new ManagementClass("Win32_Processor"); ManagementObjectCollection moc = mc.GetInstances(); string strCpuID = null; foreach (ManagementObject mo in moc) { strCpuID = mo.Properties["ProcessorId"].Value.ToString(); break; } return strCpuID; }
2、获取硬盘卷标号
每个硬盘标号出厂后都是独立且唯一的
///<summary> /// 获取硬盘卷标号 ///</summary> ///<returns></returns> public static string GetDiskVolumeSerialNumber() { ManagementClass mc = new ManagementClass("win32_NetworkAdapterConfiguration"); ManagementObject disk = new ManagementObject("win32_logicaldisk.deviceid=\"c:\""); disk.Get(); return disk.GetPropertyValue("VolumeSerialNumber").ToString(); }
3、机器码生成
根据CPU信息和硬盘标号,生成独立唯一的机器码。
机器码使用MD5加密,
///<summary> /// 生成机器码 ///</summary> ///<returns></returns> public static string GetMNum() { string strNum = DES.DESEncrypt((DateTime.Now.ToString("MMdd") + Form1.DiskID+Form1.CpuID), "12345678", "87654321"); string strMNum = strNum.Substring(0, 24).ToUpper(); //截取前24位作为机器码 return strMNum; }
3、 生成注册码
注册码保存使用MD5加密,
///<summary> /// 生成注册码 ///</summary> ///<returns></returns> public static string GetRNum() { SetIntCode(); string strMNum = GetMNum(); for (int i = 1; i < charCode.Length; i++) //存储机器码 { charCode[i] = Convert.ToChar(strMNum.Substring(i - 1, 1)); } for (int j = 1; j < intNumber.Length; j++) //改变ASCII码值 { intNumber[j] = Convert.ToInt32(charCode[j]) + intCode[Convert.ToInt32(charCode[j])]; } string strAsciiName = ""; //注册码 for (int k = 1; k < intNumber.Length; k++) //生成注册码 { if ((intNumber[k] >= 48 && intNumber[k] <= 57) || (intNumber[k] >= 65 && intNumber[k] <= 90) || (intNumber[k] >= 97 && intNumber[k] <= 122)) //判断如果在0-9、A-Z、a-z之间 { strAsciiName += Convert.ToChar(intNumber[k]).ToString(); } else if (intNumber[k] > 122) //判断如果大于z { strAsciiName += Convert.ToChar(intNumber[k] - 10).ToString(); } else { strAsciiName += Convert.ToChar(intNumber[k] - 9).ToString(); } } return strAsciiName; }
四、工程说明
1、用户软件
软件界面和封装的类,各个功能全部都是源代码,没有使用DLL封装
在开发用户软件过程,该界面功能作为子窗口集成到开发的软件中即可。
2、后台解密软件
以上就是C#程序加密与解密的流程步骤的详细内容,更多关于C#程序加密与解密的资料请关注脚本之家其它相关文章!