发布时间: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}希望我今天分享的这篇文章可以帮到您。