2013-02-01 41 views
2

我使用AesCryptoServiceProviderCryptoStream来加密某些数据,并且当我使用相同的密钥进行解密时,似乎工作正常。但是,如果我试图用错误的密钥解密它,我不会得到一个例外,只是垃圾数据。我找不到.NET文档在任何它说什么是应该发生的,但是根据这样的:AesCryptoServiceProvider尝试使用错误的密钥进行解密时的行为

http://books.google.co.uk/books?id=_Y0rWd-Q2xkC&pg=PA631

这:

Why does a bad password cause "Padding is invalid and cannot be removed"?

我应该得到一个CryptographicException 。我做错了吗?我的功能是这样的:

public static byte[] Encrypt(byte[] data, string password, string salt, bool decrypt) 
{ 
    SymmetricAlgorithm aes = new AesCryptoServiceProvider(); 
    Rfc2898DeriveBytes rfc2898 = new Rfc2898DeriveBytes(password, Encoding.UTF8.GetBytes(salt)); 
    aes.IV = rfc2898.GetBytes(aes.BlockSize/8); 
    aes.Key = rfc2898.GetBytes(256/8); 
    ICryptoTransform enc; 
    if (decrypt) { 
     enc = aes.CreateDecryptor(); 
    } else { 
     enc = aes.CreateEncryptor(); 
    } 
    using (enc) { 
     using (MemoryStream ms = new MemoryStream()) { 
      using (CryptoStream cs = new CryptoStream(ms, enc, CryptoStreamMode.Write)) { 
       cs.Write(data, 0, data.Length); 
      return ms.ToArray(); 
     } 
    } 
} 

回答

1

依靠填充错误不是确定密钥是否正确的好方法。你应该考虑使用Authenticated Encryption来达到这个目的。

我有一个公共领域snip-it,它在C#中为此Modern Examples of Symmetric Authenticated Encryption of a string.工作,我试图保持最新和审查。

P.S.此外,还不清楚您的salt是否来自您的样本的每个域,每个用户或每个密文,但是如果它不是代码中的每个密文,那么IV将是可预测的,而且对于AES-CBC不好的许多密文是相同的。实施加密非常困难。

我也曾在一个高级加密库,C# port of Google Keyczar。但是这对你来说可能不是很好,它只支持随机生成密钥和密钥集,然后这些密钥集可以进行密码加密,但只能使用密钥集。高级加密框架是加密的最佳实践。

0

如果在解密时没有设置填充,那么解密方法将无法识别垃圾。将加密和PKCS#7设置为加密和加密,解密方法可能会识别垃圾。

为了充分保证,您需要验证,正如jbtule所说。要在一个数据传递中包含身份验证和加密,请使用GCM mode。对于单独的认证使用HMAC

+0

我不是想在这种情况下防止被修改的文档,我只是想给当用户输入错误的密码而不是崩溃时,用户大部分时间都会收到明显的错误消息。因此,似乎PKCS7填充应该是足够的,但我已经检查,它已经使用PKCS7作为默认,所以我仍然不知道为什么我的程序不会给出例外 – Andy

+1

PKCS填充将无法检测到垃圾约1/256分之一的时间。不要依靠违约,明确表示。您似乎也正在生成一个用于解密的新密码(字节)。在aes.Key中打印出确切字节的检查 - 您需要检查* byte-for-byte *中的解密密码与加密密码相同,而不是character-for-character。 – rossum

0

我将不得不把我的手放在这里,说假报警。

我不知道星期五发生了什么,但现在我得到了我所期望的 - 大部分时间CryptographicException都按预期发生。我不知道我是否对测试数据非常不安,或者测试工具中是否存在一个我无意中修复的错误,但现在所有的表现都如预期。

顺便提一下,我做了一个快速的经验性测试,验证了rossum的1/256数字,但这对我的目的是可以接受的。在一般情况下,我完全接受这里有关HMAC等的其他评论,但我正在做的是一个测试工具

相关问题