C# .net加密技术-有没有办法判断解密错误?

C# .net加密技术-有没有办法判断解密错误?,c#,.net,encryption,cryptography,C#,.net,Encryption,Cryptography,问题见标题 实际上,我要做的是用用户提供的种子(关键字)加密一些数据。有没有办法知道数据被解密错了,或者换句话说,种子是错的 使用.NET2.0,C# 谢谢 将哈希作为加密数据的一部分是很正常的。比如说,您有一些数据需要加密。然后创建一个MD5散列,并将其添加到数据的末尾。然后,在解密时,获取加密数据末尾的哈希值,并验证哈希值是否没有更改。解决该问题的正式方法是在密钥周围使用一个标记(该标记本身将被加密)。这是因为您应该只完全信任私钥,而不信任提供给您的密钥。如果要使用无效密钥加密数据,则会出现

问题见标题

实际上,我要做的是用用户提供的种子(关键字)加密一些数据。有没有办法知道数据被解密错了,或者换句话说,种子是错的

使用.NET2.0,C#


谢谢

将哈希作为加密数据的一部分是很正常的。比如说,您有一些数据需要加密。然后创建一个MD5散列,并将其添加到数据的末尾。然后,在解密时,获取加密数据末尾的哈希值,并验证哈希值是否没有更改。

解决该问题的正式方法是在密钥周围使用一个标记(该标记本身将被加密)。这是因为您应该只完全信任私钥,而不信任提供给您的密钥。如果要使用无效密钥加密数据,则会出现问题

在.NET中没有内置例程(据我所知)执行密钥包装,但本质上,您可以通过使用16个字符串(或任何块大小为“a”的字符)作为实际密钥的前缀和后缀来实现相同的功能。解密密钥时,请确保它是用“A”预先修复的,如果不是,则将其标记为错误


如果您没有那么正式的要求,那么另一种选择是使用密钥解密已知使用正确密钥加密的字符串。如果解密该字符串后得到意外结果,则将其标记为错误。

取决于算法的具体情况。流密码(如RC4)本身无法检测任何篡改。由于块填充算法(),块密码(AES)可能检测到一些篡改。这种填充检查是导致抛出异常的原因,即解密失败,但这种检测不是加密安全的(在最坏的情况下,如果填充为一个字节,则不检测篡改的概率为1/256)。这并不是对.Net实现的遗漏,而是使用所有加密算法的一个基本问题


因此,鉴于解密操作本身基本上无法检测篡改(或使用坏密钥/IV),解决方案是在消息中添加消息摘要。行业标准是使用摘要,并让密钥派生过程为密钥/IV和HMAC机密生成足够的密钥材料(这是如何做到的,这几乎是“行业标准”,请参见RFC链接的6.3
密钥计算
)。解密步骤对消息进行解密,然后计算消息的HMAC,并将其与原始摘要进行比较。如果它们匹配,则解密成功(使用了正确的密钥/IV),并且消息未被篡改。

一种暴力方式-取决于您对数据所做的操作。。。将它推到任何期望它的算法上,看看它是否崩溃。我对二进制序列化数据进行了加密,并以这种方式进行了反序列化。如果数据被错误解密并变成噪声,二进制格式化程序将引发异常。

如果要防止篡改消息,请使用

常规加密不会篡改防篡改邮件。从asp.net的团队错误中学习,并将额外的验证落实到位-请参阅


如果不进行额外的验证,很可能会暴露攻击者可能用来玩系统游戏的信息。

我想大多数加密引擎如果无法成功解密,都会抛出某种异常。我的经验是,如果提供有效密钥或(有效,但不正确)。但这无助于确定解密是否成功。确实如此。当哈希不匹配时,解密不成功。您在此处要做的是检查数据是否被篡改。因为数据已加密(包括哈希),没有人可以伪造散列。因此,当散列匹配时,您肯定知道数据没有被篡改。一些系统,如EAS,包含这样一种机制。上面的描述就是这样一种机制,您可以自己实现。+1@Pieter,我想我之前误读了您的答案。我同意您的观点,如果您创建原始消息并将其包含在末尾,或一些约定的位置,然后加密整个消息和散列,然后解密者可以知道(几乎确定)通过重新计算哈希并检查其是否匹配,解密成功。换句话说,只有在原始未加密数据具有某些商定的内置检查值时,才能判断解密成功。哈希不是安全消息身份验证代码(MAC)()。此外,您在这里的建议也不完全清楚:先加密,然后散列,或者散列,然后加密,或者散列,然后加密()完整数据的散列比字符串的散列有更好的保护作用:在暴力或字典攻击期间,需要解密更多的数据来验证密码的有效性。@Eugene。这是Pieter的回答吗?我不是说散列。@PaulG不,这是我编辑文本时留下的。它是否是散列并不重要字符串或字符串的长度-攻击者需要解密的次数越多越好。只解密字符串将加快攻击速度。@Eugene。如果您的安全性依赖于能够承受50次暴力攻击而不是49.9次暴力攻击,那么是的-这是有道理的。对整个明文进行哈希运算的优点是,atta克尔无法取代部分密码。我也不太明白你们想要达到什么目的。