读书人

WinForm 实现注册码,该怎么解决

发布时间: 2012-06-02 14:16:14 作者: rapoo

WinForm 实现注册码
想实现一个软件注册的功能,我将软件给用户之后用户必须有我给的注册码才可以使用,这个注册码一定要是我给的,并且这

个注册码只能在一台电脑上面使用,下面的代码基本上实现了注册的功能,注册码是根据硬盘和CPU的编号来生成的,但是关

键的问题来了,这个注册码如何能在我手里面?不然的话用户只要拿到了这个软件就可以自行注册了,比如两个用户,其中一

个用户买了这个软件,然后复制给另一个用户,那么另一个用户可以自行注册了使用,那就惨了,期待大神的质指点。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Management;

namespace SystemTools.Register
{
public class SoftReg
{
///<summary>
/// 获取硬盘卷标号
///</summary>
///<returns></returns>
public string GetDiskVolumeSerialNumber()
{
ManagementClass mc = new ManagementClass("win32_NetworkAdapterConfiguration");
ManagementObject disk = new ManagementObject("win32_logicaldisk.deviceid=\"c:\"");
disk.Get();
return disk.GetPropertyValue("VolumeSerialNumber").ToString();
}

///<summary>
/// 获取CPU序列号
///</summary>
///<returns></returns>
public string GetCpu()
{
string strCpu = null;
ManagementClass myCpu = new ManagementClass("win32_Processor");
ManagementObjectCollection myCpuCollection = myCpu.GetInstances();
foreach (ManagementObject myObject in myCpuCollection)
{
strCpu = myObject.Properties["Processorid"].Value.ToString();
}
return strCpu;
}

///<summary>
/// 生成机器码
///</summary>
///<returns></returns>
public string GetMNum()
{
string strNum = GetCpu() + GetDiskVolumeSerialNumber();
string strMNum = strNum.Substring(0, 24); //截取前24位作为机器码
return strMNum;
}

public int[] intCode = new int[127]; //存储密钥
public char[] charCode = new char[25]; //存储ASCII码
public int[] intNumber = new int[25]; //存储ASCII码值

//初始化密钥
public void SetIntCode()
{
for (int i = 1; i < intCode.Length; i++)
{
intCode[i] = i % 9;
}
}

///<summary>
/// 生成注册码
///</summary>
///<returns></returns>
public 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、硬盘ID、MAC地址是可以修改的。换了电脑只要修改一下,一样可以使用。
2、CPUID取值只适用于单核CPU,多核CPU每个核心的ID都不一样。导致软件启动后,获取的CPUID可能不一样。(具体要看是哪个核心处理了。)
3、网上现在加密狗也便宜的,成本不大(可以淘宝上看看,便宜的10元以内,质量还是可以的)。你可以通过加密狗来授权。
[解决办法]
最简单的就是绑定硬件信息了
[解决办法]
加密狗是不错的选择

读书人网 >C#

热点推荐