C# 根据机器码生成+验证注册码简单实现demo

本文介绍了一个简单的C#程序,用于生成软件注册码并验证其有效性。该程序利用CPU ID、磁盘信息及MAC地址生成机器码,再结合指定的有效期生成加密的注册码。此外,还提供了验证注册码的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.界面如下

(1)生成注册码

输入注册码有效期(单位可选择小时、天、月、年)-> 输入机器码 -> 生成注册码

 (2)验证注册码

自动读取本地机器码 -> 输入注册码 -> 验证注册码

二.主要代码块如下

(1)生成本机机器码(cpuID+磁盘+Mac地址)

/// <summary>
/// 取本机机器码
/// </summary>
public static string GetMachineCode()
{
    //CPU信息
    string cpuInfo = GetMD5Value(GetCpuID() + typeof(string).ToString());
    if (cpuInfo.Equals("UnknowCpuInfo")) return null;
    //磁盘信息
    string diskInfo = GetMD5Value(GetDiskID() + typeof(int).ToString());
    if (diskInfo.Equals("UnknowDiskInfo")) return null;
    //MAC地址
    string macInfo =  GetMD5Value(GetMacByNetworkInterface() + typeof(double).ToString());
    if (macInfo.Equals("UnknowMacInfo")) return null;
    //返回机器码
    return GetNum(cpuInfo, 8) + GetNum(diskInfo, 8) + GetNum(macInfo, 8);
}

/// <summary>
/// 取MD5
/// </summary>
/// <param name="value">要加密的字符串</param>
public static string GetMD5Value(string value)
{
    MD5 md5 = new MD5CryptoServiceProvider();
    byte[] targetData = md5.ComputeHash(Encoding.Unicode.GetBytes(value));
    string resString = null;
    for (int i = 0; i < targetData.Length; i++)
    {
        resString += targetData[i].ToString("x");
    }
    return resString;
}

/// <summary>
/// 取数字
/// </summary>
/// <param name="md5"></param>
/// <param name="len"></param>
/// <returns></returns>
public static string GetNum(string md5, int len)
{
    Regex regex = new Regex(@"\d");
    MatchCollection listMatch = regex.Matches(md5);
    string str = "";
    for (int i = 0; i < len; i++)
    {
        str += listMatch[i].Value;
    }
    while (str.Length < len)
    {
        //不足补0
        str += "0";
    }
    return str;
}

/// <summary>
/// 取CPU序列号
/// </summary>
public static string GetCpuID()
{
    try
    {
        string cpuInfo = "";
        ManagementClass mc = new ManagementClass("Win32_Processor");
        ManagementObjectCollection moc = mc.GetInstances();
        foreach (ManagementObject mo in moc)
        {
            cpuInfo = mo.Properties["ProcessorId"].Value.ToString();
        }
        moc.Dispose();
        mc.Dispose();
        return cpuInfo;
    }
    catch
    {
        return "UnknowCpuInfo";
    }
}

/// <summary>
/// 取硬盘序列号
/// </summary>
public static string GetDiskID()
{
    try
    {
        string HDid = "";
        ManagementClass mc = new ManagementClass("Win32_DiskDrive");
        ManagementObjectCollection moc = mc.GetInstances();
        foreach (ManagementObject mo in moc)
        {
            HDid = (string)mo.Properties["Model"].Value;
        }
        moc.Dispose();
        mc.Dispose();
        return HDid;
    }
    catch
    {
        return "UnknowDiskInfo";
    }
}

/// <summary>
/// 获取本机MAC地址
/// </summary>
public static string GetMacByNetworkInterface()
{
    try
    {
        NetworkInterface[] interfaces = NetworkInterface.GetAllNetworkInterfaces();
        foreach (NetworkInterface ni in interfaces)
        {
            return BitConverter.ToString(ni.GetPhysicalAddress().GetAddressBytes());
        }
        return "UnknowMacInfo";
    }
    catch (Exception)
    {
        return "UnknowMacInfo";
    }
}

(2)根据机器码生成注册码

//加密key
public static string machineCodeEncryptKey = "9832";

/// <summary>
/// 根据机器码产生注册码
/// </summary>
/// <param name="machineCode">机器码</param>
/// <param name="overTime">到期时间</param>
/// <returns>注册码</returns>
public static string CreateRegisterCode(string machineCode, DateTime overTime)
{
    //格式:机器码&过期时间&注册时间
    var finalCode = machineCode + "&" + overTime.ToString("s") + "&" + DateTime.Now.ToString("s");
    //加密
    return ToEncryptString(machineCodeEncryptKey, finalCode);
}

/// <summary>
/// 字符串加密
/// </summary>
/// <param name="key">加密key</param>
/// <param name="str">要加密的字符串</param>
public static string ToEncryptString(string key, string str)
{
    try
    {
        //将密钥字符串转换为字节序列
        var P_byte_key = Encoding.Unicode.GetBytes(key);
        //将字符串转换为字节序列
        var P_byte_data = Encoding.Unicode.GetBytes(str);
        //创建内存流对象
        MemoryStream mStream = new MemoryStream();
        {
            using (CryptoStream P_CryptStream_Stream = new CryptoStream(mStream, new DESCryptoServiceProvider().CreateEncryptor(P_byte_key, P_byte_key), CryptoStreamMode.Write))
            {
                //向加密流中写入字节序列
                P_CryptStream_Stream.Write(P_byte_data, 0, P_byte_data.Length);
                //将数据压入基础流
                P_CryptStream_Stream.FlushFinalBlock();
                //从内存流中获取字节序列
                var res = mStream.ToArray();
                P_CryptStream_Stream.Dispose();
                mStream.Dispose();
                return Convert.ToBase64String(res);
            }
        }
    }
    catch (CryptographicException ce)
    {
        throw new Exception(ce.Message);
    }
}

(3)本地机器码验证注册码(授权时间校验)

//加密key
public static string machineCodeEncryptKey = "9832";

/// <summary>
/// 检查注册码(校验本地机器码)
/// </summary>
/// <param name="registerCode">注册码</param>
/// <param name="overTime">返回过期时间</param>
/// <param name="registerTime">返回注册时间</param>
/// <returns>机器码与注册码匹配结果</returns>
public static bool CheckRegister(string registerCode, ref DateTime overTime, ref DateTime registerTime)
{
    try
    {
        var finalCodeList = ToDecryptString(machineCodeEncryptKey, registerCode).Split('&');
        if (finalCodeList.Length == 3)
        {
            DateTime.TryParse(finalCodeList[1], out overTime);
            DateTime.TryParse(finalCodeList[2], out registerTime);
            //获取本地机器码
            var machineCode = GetMachineCode();
            return machineCode != null && (finalCodeList[0] == machineCode);
        }
        else
        {
            return false;
        }
    }
    catch
    {
        return false;
    }
}

/// <summary>
/// 字符串解密
/// </summary>
/// <param name="key">加密key</param>
/// <param name="str">要解密的字符串</param>
public static string ToDecryptString(string key, string str)
{
    try
    {
        //将密钥字符串转换为字节序列
        var P_byte_key = Encoding.Unicode.GetBytes(key);
        //将加密后的字符串转换为字节序列
        var P_byte_data = Convert.FromBase64String(str);
        //创建内存流对象并写入数据,创建加密流对象
        CryptoStream cStream = new CryptoStream(new MemoryStream(P_byte_data), new DESCryptoServiceProvider().CreateDecryptor(P_byte_key, P_byte_key), CryptoStreamMode.Read);
        //创建字节序列对象
        var tempDate = new byte[200];
        //创建内存流对象
        MemoryStream mStream = new MemoryStream();
        //创建记数器
        int i = 0;
        //使用while循环得到解密数据
        while ((i = cStream.Read(tempDate, 0, tempDate.Length)) > 0)
        {
            //将解密后的数据放入内存流
            mStream.Write(tempDate, 0, i);
        }
        var res = Encoding.Unicode.GetString(mStream.ToArray());
        mStream.Dispose();
        cStream.Dispose();
        return res;
    }
    catch (CryptographicException ce)
    {
        throw new Exception(ce.Message);
    }
}

三.源代码网盘地址

链接:https://pan.baidu.com/s/1thozg6dQTLHstHrMSEhuOQ 
提取码:0304

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值