机器码注册码(机器码注册机制作_天正机器码和注册码[通俗易懂])

发布时间:2025-12-10 19:37:13 浏览次数:10

机器码注册机制作_天正机器码和注册码[通俗易懂]-机器码注册码算法破解

机器码注册机制作_天正机器码和注册码[通俗易懂]文章浏览阅读8k次,点赞3次,收藏20次。生成注册码(对称加密)非对称加密自然是要更安全的,因为软件里没有私钥。但该方法最大的缺点就是密钥太长,注册码太长,无法手抄。鉴于我们假设激活成功教程者是无法对软件反编译的,使用对称加密也未尝不可。流程跟上一

生成注册码(对称加密)

非对称加密自然是要更安全的,因为软件里没有私钥。但该方法最大的缺点就是密钥太长,注册码太长,无法手抄。鉴于我们假设激活成功教程者是无法对软件反编译的,使用对称加密也未尝不可。

流程跟上一节提到的基本一致。加密方法可以使用DES,密钥最短是64位,也就是16个字符。明文信息最长是7个字节,我们用4个字节存放机器码(相当于一个int),然后剩下的三个字节存放过期信息。

下面是实现整个过程的一个示例代码(C#):

/// <summary>/// 机器码认证/// </summary>public static class MachineAuth{    /// <summary>    /// 获得机器码    /// </summary>    /// <returns>机器码字节流</returns>    private static byte[] GetMachineCodeByte()    {        string dir = @"C:\Windows\Temp";        Directory.CreateDirectory(dir);        string file = Path.Combine(dir, "machine_code");        if (File.Exists(file))        {            FileStream fs = File.OpenRead(file);            byte[] data = new byte[4];            fs.Read(data, 0, 4);            fs.Close();            return data;        }        else        {            byte[] data = new byte[4];            Random rand = new Random();            for (int i = 0; i < 4; i++)            {                data[i] = (byte)rand.Next(256);            }            FileStream fs = File.OpenWrite(file);            fs.Write(data, 0, 4);            fs.Close();            (new FileInfo(file)).Attributes = FileAttributes.Hidden;            return data;        }    }    /// <summary>    /// 获得机器码    /// </summary>    /// <returns>机器码</returns>    public static string GetMachineCode()    {        byte[] code = GetMachineCodeByte();        return ByteToString(Encrypt(code));    }    /// <summary>    /// 机器码和认证码是否配对正确    /// </summary>    /// <param name="MachineCode">机器码</param>    /// <param name="AuthCode">认证码</param>    /// <returns>配对成功</returns>    public static bool IsCodeValid(string MachineCode, string AuthCode)    {        return IsCodeValid(MachineCode, AuthCode, DateTime.Now);    }    /// <summary>    /// 机器码和认证码是否配对正确    /// </summary>    /// <param name="MachineCode">机器码</param>    /// <param name="AuthCode">认证码</param>    /// <param name="now">当前时间</param>    /// <returns>配对成功</returns>    public static bool IsCodeValid(string MachineCode, string AuthCode, DateTime now)    {        try        {            byte[] machine_code1 = Decrypt(StringToByte(MachineCode));            byte[] machine_code2 = GetMachineCodeByte();            for (int i = 0; i < 4; i++)            {                if (machine_code1[i] != machine_code2[i])                {                    return false;                }            }            byte[] auth_code = Decrypt(StringToByte(AuthCode));            for (int i = 0; i < 7; i++)            {                auth_code[i] ^= mask[i];            }            for (int i = 0; i < 4; i++)            {                if (machine_code1[i] != auth_code[i])                {                    return false;                }            }            DateTime time = new DateTime(2000 + auth_code[4], auth_code[5], auth_code[6]);            if (time < now)            {                return false;            }            return true;        }        catch        {            return false;        }    }#if DEBUG    /// <summary>    /// 获得认证码    /// </summary>    /// <param name="MachineCode">机器码字符串</param>    /// <param name="days">有效天数,-1为长期</param>    /// <returns>认证码</returns>    public static string GetAuthCode(string MachineCode, int days = -1)    {        byte[] machine_code = Decrypt(StringToByte(MachineCode));        byte[] data = new byte[7];        Array.Copy(machine_code, data, 4);        if (days == -1)        {            data[4] = 99;            data[5] = 12;            data[6] = 30;        }        else        {            DateTime time = DateTime.Now.AddDays(days);            data[4] = (byte)(time.Year % 100);            data[5] = (byte)time.Month;            data[6] = (byte)time.Day;        }        for (int i = 0; i < 7; i++)        {            data[i] ^= mask[i];        }        return ByteToString(Encrypt(data));    }#endif    #region 辅助函数    private static readonly byte[] key = new byte[] { 0x13, 0x9D, 0x1F, 0x05, 0x8B, 0xB4, 0x88, 0xA0 };    private static readonly byte[] iv = new byte[] { 0x35, 0x79, 0xD4, 0xBC, 0x21, 0x90, 0x0F, 0xE5 };    private static readonly byte[] mask = new byte[] { 0x72, 0x6F, 0x7B, 0x5D, 0xEA, 0x08, 0x87 };    private static byte[] Encrypt(byte[] indata)    {        byte[] result = null;        var des = new DESCryptoServiceProvider();        using (var ms = new MemoryStream())        {            using (var cs = new CryptoStream(ms, des.CreateEncryptor(key, iv), CryptoStreamMode.Write))            {                cs.Write(indata, 0, indata.Length);                cs.FlushFinalBlock();            }            result = ms.ToArray();        }        return result;    }    private static byte[] Decrypt(byte[] indata)    {        byte[] result = null;        var des = new DESCryptoServiceProvider();        using (var ms = new MemoryStream())        {            using (var cs = new CryptoStream(ms, des.CreateDecryptor(key, iv), CryptoStreamMode.Write))            {                cs.Write(indata, 0, indata.Length);                cs.FlushFinalBlock();            }            result = ms.ToArray();        }        return result;    }    private static string ByteToString(byte[] bytes)    {        StringBuilder sb = new StringBuilder();        foreach (byte b in bytes)        {            sb.Append(b.ToString("X2"));        }        return sb.ToString();    }    private static byte[] StringToByte(string str)    {        byte[] data = new byte[str.Length / 2];        for (int i = 0; i < str.Length / 2; i++)        {            data[i] = Convert.ToByte(str.Substring(i * 2, 2), 16);        }        return data;    }    #endregion}

希望我今天分享的这篇文章可以帮到您。

需要做网站?需要网络推广?欢迎咨询客户经理 13272073477