1

我正在使用 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;
}

}

和每次都回来一样,但当我打电话给GetHardwareSerial它时,它不是。applicationGuidEncryptStringAES

我使用了错误的课程吗?不应该每次都一样吗?

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

4

3 回答 3

4

您的“加密”实际上只是混淆并且不太难绕过。所有需要知道的是您的应用程序 guid(可能存储为公共)和获取相同硬件 ID 的方法(您可能没有编写它并且很容易找到)。

当然,您希望保护工作有多难还取决于您的软件的价值或高容量,因此简单的混淆可能就足够了。忘记 AES,你需要的是一个散列算法,例如 SHA 或 MD5,你可以将你的应用程序 guid、硬件编号、用户名等散列在一起并存储散列。对于大多数典型用户来说,这足以起到威慑作用。

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

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

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

请检查此问题以获取更多信息。

于 2013-02-12T15:29:35.797 回答
3

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

因此,您每次都会得到不同的结果。(例如,您可以在Wikipedia上找到有关 IV 用途的更多信息。)

于 2013-02-12T15:13:23.607 回答
0

Yeah most AES encryption is non-deterministic (and for good reason) it will not work for you, but since you just want to compare a cryptographic result and you aren't really wanting to decrypt, might I suggest using HMAC instead.

于 2013-02-12T15:47:53.790 回答