C# 加密值不是每次都返回相同的值

C# 加密值不是每次都返回相同的值,c#,encryption,C#,Encryption,我正在使用Brett给出的示例: 这样做: public static bool VerifyLicenseKey(string applicationGuid) { Console.WriteLine("G: " + applicationGuid); var appSettings = AppSettings.GetInstance(); if (appSettings == null) { return false; } var hwinfo = Hard

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

gethardwareseerial
applicationGuid
每次返回时都是一样的,但当我调用
EncryptStringAES
时就不是了

我用错班级了吗?不是每次都是一样的吗


如果没有,是否有人有一个更好的示例,其中嵌入的值相同?

您所指的算法使用,并且它似乎使用默认值,每当您创建新实例时,该值(非常正确)自动设置为一个新的随机值(请参阅文档)


因此,每次都会得到不同的结果。(例如,您将了解更多关于IV on的用途。)

您所指的算法使用,并且它似乎使用默认值,每当您创建新实例时,该值(非常正确)自动设置为新的随机值(请参阅文档)

因此,每次都会得到不同的结果。(例如,你会发现更多关于IV的用途。)

你的“加密”实际上只是模糊处理,不太难绕过。 您只需要知道您的应用程序guid(可能存储为public)和获取相同硬件ID的方法(您可能没有编写它,而且很容易找到)

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

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

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

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

还有更多信息。

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

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

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

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

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


还有更多信息。

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

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

此信息实际上是机密信息,还是只需要正确?我想你想要的是a或a,而不是加密。或者你可以使用更简单的MD5哈希或CRC32校验和。你到底想在这里做什么?这对我来说毫无意义。你能解释一下你想解决什么问题吗?为什么你认为加密是一个合适的解决方案?加密应该只用于两件事:(1)对秘密消息进行编码和解码;(2)对消息进行数字签名。你似乎没有做这两件事,所以很难评估你做错了什么;整个事情似乎都错了。至于你的问题:没有任何要求,给定的明文在加密两次后产生相同的密文。要求密文在解密时产生明文;可能有许多密文解密为相同的明文。正如我之前所说,如果你没有使用密文来保护一条秘密消息,那么你使用的工具是错误的。那么你需要加密做什么呢?如果这是一个简单的机制,那么保持它的简单。如果你需要的是一个“请勿靠近”的标志,那么你为什么要用一个带有激光和鳄鱼的钢制portcullis;或者,更准确地说,一个装有激光和鳄鱼的钢铁门,还有一扇敞开的后门?这些信息真的是秘密的吗,还是只需要是正确的?我想你想要的是a或a,而不是加密。或者你可以使用更简单的MD5哈希或CRC32校验和。你到底想在这里做什么?这对我来说毫无意义。你能解释一下你想解决什么问题吗?为什么你认为加密是一个合适的解决方案?加密应用于两件事,且仅用于两件事:(1)对秘密消息进行编码和解码,以及