本代码的实现思路:
根据服务器端的某些机器码,经过处理后得到ID号。ID号经过加密算法加密后,形成序列号。注册时,用户将ID号告知软件权益所有者,软件权益所有者将序列号告知用户。用户根据此序列号注册时,序列号被保存在数据库中。在asp.net程序中进行注册检查,根据探测服务器端机器码生成的序列号与数据库中的序列号进行比较,如二者一致则为注册程序,反之则为非注册程序。
本代码主要由以下文件组成。
1、reg_forcool.cs,包含了实现注册功能的各种函数,作为封装引用,保存在BIN文件夹下面。
2、Reg.aspx和Reg.aspx.cs,注册程序,用户根据程序提供的ID号向软件权益所有者索取序列号进行注册。
3、GetSN.aspx和GetSN.aspx.cs,生成序列号程序,根据用户的ID号生成序列号。此程序不提供给用户,由软件权益所有者保存。
4、check_reg.aspx和check_reg.aspx.cs,检查是否注册程序,此程序可移植到其它用户必用的重要页面中。
1、reg_forcool.cs 实现注册功能的各种函数
//作为封装引用,保存在BIN文件夹下面
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Collections.Generic;
using System.Text;
using System.Management;//您需要在解决方案资源管理器中添加引用System.Management
using System.Security;//您需要在解决方案资源管理器中添加引用System.Security
using System.Security.Cryptography;
using System.IO;
namespace Reg_forcool_NameSpace
{
public class Reg_forcool_Class
{
/// <summary>
/// 取得网卡mac地址
/// </summary>
/// <returns></returns>
public string GetNetCardMacAddress()
{
ManagementClass mc;
ManagementObjectCollection moc;
mc = new ManagementClass("Win32_NetworkAdapterConfiguration");
moc = mc.GetInstances();
string str = "";
foreach (ManagementObject mo in moc)
{
if ((bool)mo["IPEnabled"] == true)
str = mo["MacAddress"].ToString();
}
str = str.Replace(":", "");
return str;
}
/// <summary>
/// C盘序列号
/// </summary>
/// <returns></returns>
public string GetDiskVolumeSerialNumber()
{
ManagementObject disk;
disk = new ManagementObject("win32_logicaldisk.deviceid="c:"");
disk.Get();
return disk.GetPropertyValue("VolumeSerialNumber").ToString();
}
/// <summary>
/// 取得id号,如果有网卡mac地址则返回c盘序列号,没有则返回c盘序列号
///此处没有采用cpu序列号是因为涉及到多核cpu会导致序列号的不唯一性。
/// </summary>
/// <returns></returns>
public string GetId()
{
string str = GetNetCardMacAddress();
if (str == "")
{
str = GetDiskVolumeSerialNumber();
}
if (str == "")
{
str = "cccccccc";
}
return str;
}
/// <summary>
/// (可逆加密)
/// </summary>
/// <returns></returns>
///注意第二个参数必须为8个或以上的字符,您可以通过修改第二个参数得到不同的序列号
public string DesEncrypt(string strText, string strEncrKey)
{
byte[] byKey = null;
byte[] IV = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF };
try
{
byKey = System.Text.Encoding.UTF8.GetBytes(strEncrKey.Substring(0, strEncrKey.Length));
DESCryptoServiceProvider des = new DESCryptoServiceProvider();
byte[] inputByteArray = Encoding.UTF8.GetBytes(strText);
MemoryStream ms = new MemoryStream();
CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(byKey, IV), CryptoStreamMode.Write);
cs.Write(inputByteArray, 0, inputByteArray.Length);
cs.FlushFinalBlock();
return Convert.ToBase64String(ms.ToArray());
}
catch (System.Exception error)
{
return "error:" + error.Message + "r";
}
}
/// <summary>
/// 根据c盘或网卡mac地址用加密方法生成序列号
/// </summary>
/// <returns></returns>
public string GetSN_Exterior()
{
string id = GetId(); //取得服务器端ID号
string str = DesEncrypt(id, "forcools");//注意第二个参数必须为8个或以上的字符
if (str.Length > 20)
{
str = str.Substring(0, 20);
}
str = str.Substring(0, 4) + "-" + str.Substring(4, 6) + "-" + str.Substring(10, 6) + "-" + str.Substring(16, 4);
return str;
}
/// <summary>
/// 根据c盘或网卡mac地址用加密方法生成序列号
/// </summary>
/// <returns></returns>
public string GetSN_Exterior(string id)
{
string str = DesEncrypt(id, "forcools");//注意第二个参数必须为8个或以上的字符
if (str.Length > 20)
{
str = str.Substring(0, 20);
}
str = str.Substring(0, 4) + "-" + str.Substring(4, 6) + "-" + str.Substring(10, 6) + "-" + str.Substring(16, 4);
return str;
}
/// <summary>
/// //检查是否注册
/// </summary>
/// <returns>注册返回true,未注册返回false</returns>
public bool CheckReg(string SN)
{
string RightSN = GetSN_Exterior();
bool rst = false;
if (SN == RightSN)
{
rst = true;
}
return rst;
}
}
}
2、Reg.aspx,注册程序,用户根据程序提供的ID号向软件权益所有者索取序列号进行注册
3、Reg.aspx.cs文件
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using Reg_forcool_NameSpace;
public partial class forcool_Reg : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
Reg_forcool_Class r_forcool_class = new Reg_forcool_Class();
TextBox1.Text = r_forcool_class.GetId();
}
protected void Button1_Click(object sender, EventArgs e)
{
string SN = TextBox2.Text;
//如果序列号不为空
if (SN != "")
{
Reg_forcool_Class r_forcool_class = new Reg_forcool_Class();
string Right_SN = r_forcool_class.GetSN_Exterior();
//如果注册成功
if (SN == Right_SN)
{
/////////////////////////
//在这里将序列号写进数据库,您需要自行添加代码实现此功能
////////////////////////
Label1.Text = "注册成功!";
}
//如果注册失败
else
{
Label1.Text = "注册失败!序列号不正确。";
}
}
//如果序列号为空
else
{
Label1.Text = "序列号不能为空";
}
}
}