加密后的值不会每次都返回相同的值

本文关键字:返回 加密 | 更新日期: 2023-09-27 17:58:53

我使用的是Brett给出的这个例子:

加密和解密字符串

这样做:

public static bool VerifyLicenseKey(string applicationGuid)
{
  Console.WriteLine("G: " + applicationGuid);
  var appSettings = AppSettings.GetInstance();
  if (appSettings == null)
  {
    return false;
  }
  var hwinfo = HardwareInfo.GetHardwareSerial();
  Console.WriteLine("h: " + hwinfo);
  Console.WriteLine("a: " + applicationGuid);
  var currentSerial = Crypto.EncryptStringAES(hwinfo, applicationGuid);
  Console.WriteLine("c: " + currentSerial);
  Console.WriteLine("o: " + appSettings.LicenseSerialNumber);
  if (currentSerial == appSettings.LicenseSerialNumber)
  {
    return true;
  }
  return false;
}

}

GetHardwareSerialapplicationGuid每次都是一样的,但当我调用EncryptStringAES时,情况并非如此。

我用错课了吗?难道每次都不一样吗?

如果没有,是否有人有一个更好的例子,其中加密的值是相同的?

加密后的值不会每次都返回相同的值

您的"加密"实际上只是混淆,不太难绕过。你只需要知道你的应用程序guid(可能是公共存储的)和获得相同硬件ID的方法(你可能没有写,很容易找到)。

当然,你希望你的保护工作有多难也取决于你的软件的价值或容量,所以简单的模糊处理就足够了。忘记AES吧,这里你需要的是一个哈希算法,比如SHA或MD5,你可以将你的应用程序guid、硬件编号、用户名等哈希在一起并存储哈希。对于大多数典型的用户来说,这将是一个足够的威慑。

如果你坚持拥有难以破解的保护,你需要的是数字签名和激活程序。请参阅RSACryptoServiceProvider。

基本上,您创建了一个知道您的私钥的服务,并将匹配的公钥放置在软件中。然后,从你的软件中,你用HardwareInfo和你想验证的任何其他信息调用该服务,该服务会对其进行签名并返回签名哈希。

一旦你的客户端有了它,你就可以使用公钥来检查签名,即使信息可以以明文存储,签名也不容易重新创建。

请查看此问题以了解更多信息。

您所指的算法使用RijndaelManaged类,它似乎使用其IV属性的默认值,该属性(非常正确)在您创建新实例时自动设置为新的随机值(请参阅文档)。

因此,你每次都会得到不同的结果。(例如,你可以在维基百科上找到更多关于IV目的的信息。)

是的,大多数AES加密都是不确定的(有充分的理由),它对你不起作用,但由于你只是想比较加密结果,而不是真的想解密,我建议你改用HMAC。