如果密码不正确,Rijndael是否总是抛出异常?

时间:2009-10-12 20:24:35

标签: .net encryption passwords rijndaelmanaged

我正在使用Rijndael来加密/解密将在某些文档上使用的一些敏感图像。我正在努力绝对确定提供的密码是有效的,并且由于命运的一些怪癖,不正确的密码将导致损坏的图像最终出现在文档上。如果我在此之前没有抓住它,很多文件和金钱最终会被扔掉。

我目前的计划是创建一个MD5校验和以与图像一起存储。如果解密的流的MD5与原始流不同,我知道密码不正确。但是,在测试中,似乎错误的密码会导致抛出异常。

100%的时间都是如此吗?我可以取消校验和并捕获异常吗?

2 个答案:

答案 0 :(得分:3)

使用.Net中的所有对称密钥算法,验证发生在最后一个块,其中包含填充信息(通常为PKCS7)。如果最后一个解密的块不包含有效的填充信息,则将假定数据为“坏”(或密钥为“坏”)。对于cipher chainning block modes,此方法相当不错,因为意外删除的概率非常低,与有效的填充信息格式相匹配。对于ECB模式,事情会发生变化,但无论如何都会破坏ECB模式,不应该使用它。

许多应用程序在数据开头使用“魔术”数字和文本来验证解密的内容格式。 100%,防弹精度要求您可能会将自己的HMAC添加到数据中。如果您可以控制格式,那么我强烈建议您对加密数据进行签名。

答案 1 :(得分:2)

加密不使用密码,它使用密钥。当密钥错误时,解密不会自动导致异常,这意味着可以从加密数据中提取密钥,这将使加密变得毫无意义。解密将始终产生结果,但除非密钥是正确的,否则它将是随机垃圾。

(正如Remus指出的那样,最后一个块的填充可用于捕获不正确的数据,但有些文件根本不需要任何填充,有时不正确的数据可能会产生看起来像正确填充的东西。)< / p>

你在哪里获得例外?是在尝试将解密数据作为图像加载时?在这种情况下,您不能依赖它作为100%安全的方法来确定密钥是否正确,因为随机数据很可能形成可以作为图像加载的东西。

存储原始数据的MD5校验和以及加密数据也不是一个好主意。这意味着您拥有有关未加密的原始数据的信息,并且可以用来破解密钥。