蛙蛙推荐:蛙蛙牌软件注册码算法
摘要:辛辛苦苦写个共享软件,又怕被人破解,所以就会想到用注册码的方式来激活软件。本蛙给大家一个简单的思路来实现软件注册码算法,当然.net做的东西很容易被人破解,反编译出来把验证注册码的代码一去就算破解了,不过咱不讨论这个先。
思路:
1、首先要取出机器的唯一码,一般都是通过取网卡的MAC地址,CPU编号,硬盘序列号等,.net取这些东西很容易,用WMI接口就O了,取出来之后用MD5取一下摘要信息就算是机器的唯一码了。
2、完了一般要通过电子邮件等手段把机器码发给软件作者,软件作者用一定的算法给这个机器码算出一个注册码。这个算注册码的方式,其实也能很简单,最简单的就是把机器码的自如串按位异或一个key得到一个字符串就可以作为注册码,当然这个key不能告诉别人,或者是把机器码进行若干次的MD5取值,这个若干次也不能告诉别人。本文用的是前者,异或的方式。key是一个长度的,就一个H,大家可以自己编写更强的加密算法。
3、用户拿到注册码之后,在注册界面上输入,点注册按钮要把机器码和注册码发到一个指定的网址去验证注册码是否合法。这个远程的验证网页可以用任何语言来实现,其实就是把机器码用生成注册码的算法算出注册码,然后再和用户提供的注册码来对比,如果匹配就返回注册成功,如果不匹配就返回注册失败。本文用的是Php实现的验证页面,注册成功就返会1,否则返回0
不说了,上代码
{
private static int key = 72;
private static string zhuceyonghu = string.Empty;
public Form3()
{
InitializeComponent();
}
//验证注册码
private void button1_Click(object sender, EventArgs e)
{
//把机器码和验证码发送到指定验证网址去验证
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(
string.Format(@"http://www.xxx.com/test/jiami.php?s={0}&x={1}",textBox1.Text,textBox2.Text));
request.Timeout = 8000;
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Encoding encoding = Encoding.ASCII;
StreamReader reader = new StreamReader(response.GetResponseStream(), encoding);
string str = reader.ReadToEnd().TrimEnd('\n').TrimEnd('\r').Trim();
response.Close();
reader.Close();
//如果返回0表示注册码不对,否则表示验证通过
if(str=="0")
{
MessageBox.Show("注册码不对");
//Application.Exit();
}
else
{
MessageBox.Show("OK");
}
//以下是c#版的通过机器码算注册码的算法
//byte[] bs = Encoding.ASCII.GetBytes(textBox1.Text);
//List<byte> r = new List<byte>();
//foreach (byte b in bs)
//{
// r.Add((byte)(b ^ key));
//}
//textBox2.Text= Convert.ToBase64String(r.ToArray());
}
//取CPU编号
public 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 "";
}
}//end method
//获取网卡mac地址
public string GetMac()
{
try
{
ManagementObjectSearcher query = new ManagementObjectSearcher("SELECT * FROM Win32_NetworkAdapterConfiguration");
ManagementObjectCollection queryCollection = query.Get();
foreach (ManagementObject mo in queryCollection)
{
if (mo["IPEnabled"].ToString() == "True")
return mo["MacAddress"].ToString();
}
return "";
}
catch
{
return "";
}
}
//取出机器唯一码显示给用户
private void Form3_Load(object sender, EventArgs e)
{
//1、取出机器唯一码
string input = GetCpuID() + GetMac();
//2、如果取唯一码出错,直接退出
if(input.Length < 5)
{
MessageBox.Show("程序出错,即将退出");
Application.Exit();
}
//3、取出机器唯一码的摘要并转换成字符串
System.Security.Cryptography.MD5 md5 = new System.Security.Cryptography.MD5CryptoServiceProvider();
byte[] bs = md5.ComputeHash(Encoding.ASCII.GetBytes(input));
zhuceyonghu = BitConverter.ToString(bs).Replace("-", "").ToLower();
textBox1.Text =zhuceyonghu;
}
}
注册码验证页面
function xorEncoding($string,$key){
$encoding="";
for($i=0;$i<strlen($string);$i++){
$encoding=$encoding.($string[$i]^$key);
}
return base64_encode($encoding);
}
$s=$_GET['s'];
$k="H";
$estr=xorEncoding($s,$k); //加密
if($estr==$_GET['x']){
echo "1";
}else
{
echo "0";
}
?>
相关度链接:
.NET MD5 与 PHP MD5
http://www.phpchina.com/1703/viewspace_10146.html
php异或加密信息
http://hi.baidu.com/bluefrog/blog/item/e2979725ca76426434a80fd0.html
“简单异或”加密算法的破解技术演示程序
http://www.cnblogs.com/sumtec/articles/30855.html
遇见一个GET参数问题!请求帮助,急急在先等到100分!!!
http://topic.csdn.net/u/20070110/10/8a334e64-58f1-4387-ab12-efbce6983544.html
用什么语句能让C#取出网卡的MAC地址?
http://n.dvbbs.net/topic/t555312
Net中获取CPU编号
http://www.cnblogs.com/Tonyyang/archive/2007/04/24/725734.html
用.net 中的MD5实现php的md5()
http://www.cnblogs.com/geel/archive/2004/10/24/56218.html
ASCII码表
http://www.96yx.com/tool/ASC2.htm