很多基于cs的软件,开发完后都要考虑软件加密的问题。在网上找了一些资料,总结一下。实现根据每台电脑的硬件的序列号来实现对每台电脑的单独加密。
一般的原理是,首先读取客户电脑硬件的序列号,因为序列号一般情况下是不可能相同的。然后再根据序列号进行加密处理,然后生成客户机软件的唯一注册码,发给用户就行了。当然这种方式无法达到防破解的目的,只能说让一些不具备专业知识的人不能通过简单的拷贝来使用软件
步骤如下。
一、写一个读取客户硬件信息的小工具来生成激活码,这里采用磁盘某卷序列号和CPU序列号的组合来生成激活码,主要代码如下
[DllImport("kernel32.dll")] private static extern int GetVolumeInformation( string lpRootPathName, string lpVolumeNameBuffer, int nVolumeNameSize, ref int lpVolumeSerialNumber, int lpMaximumComponentLength, int lpFileSystemFlags, string lpFileSystemNameBuffer, int nFileSystemNameSize ); /// <summary> /// 获取磁盘卷标的序列号 /// </summary> /// <param name="drvID"></param> /// <returns></returns> private string GetVolOf(string drvID) { const int MAX_FILENAME_LEN = 256; int retVal = 0; int a = 0; int b = 0; string str1 = null; string str2 = null; int i = GetVolumeInformation( drvID + @":/", str1, MAX_FILENAME_LEN, ref retVal, a, b, str2, MAX_FILENAME_LEN ); return retVal.ToString("x"); } /// <summary> /// 取CPU号 /// </summary> /// <returns></returns> private string GetCpuID() { try { 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; } catch { return " "; } }
读取磁盘卷标序列号时,调用了API函数GetVolumeInformation
获取激活码,ActivationCode=GetVolOf("C")+GetCPUID();
这个工具和软件一起打包给客户,比如先给客户一个试用期,试用期过后软件就需要注册了。客户通过这个工具获取客户机的唯一激活码ActivationCode
二、写一个注册码生成器
注册码生成器的主要目的是通过客户反馈的激活码,生成一个唯一注册码,方式主要是通过反复加密和格式化
比如我们这里采用MD5进行加密,可以根据自己的需求采用多中方式反复加密,加强软件保护
private static string Encrypt(string str1) { string cl1 = str1; string pwd = ""; MD5 md5 = MD5.Create(); // 加密后是一个字节类型的数组 byte[] s = md5.ComputeHash(Encoding.Unicode.GetBytes(cl1)); // 通过使用循环,将字节类型的数组转换为字符串,此字符串是常规字符格式化所得 for (int i = 0; i < s.Length; i++) { // 将得到的字符串使用十六进制类型格式。格式后的字符是小写的字母,如果使用大写(X)则格式后的字符是大写字符 pwd = pwd + s[i].ToString("x"); if ((i + 1) % 2 == 0 && i != s.Length - 1) { pwd += "-"; } } return pwd; }
这样RegistrationCode=Encrypt(ActivationCode);
三、根据客户返回的激活码,通过注册码生成器生成一个唯一注册码发送个客户
四、客户注册,通过判断注册码与客户机硬件序列号的关联,达到注册的目的