0

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

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

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

4

2 回答 2

4

对于 .Net 中的所有对称密钥算法,验证发生在最后一个块,其中包含填充信息(通常是PKCS7)。如果最后解密的块不包含有效的填充信息,则假定数据是“坏的”(或密钥是“坏的”)。对于密码链接块模式,此方法相当不错,因为与有效填充信息格式匹配的意外碰撞的可能性非常低。对于 ECB 模式,情况会发生变化,但 ECB 模式无论如何都会被破坏,永远不应该使用。

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

于 2009-10-12T20:38:21.977 回答
2

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

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

你从哪里得到异常?是在尝试将解密的数据作为图像加载时吗?在这种情况下,您不能将其作为 100% 安全的方法来确定密钥是否正确,因为随机数据极有可能形成可作为图像加载的内容。

将原始数据的 MD5 校验和与加密数据一起存储也不是一个好主意。这意味着您拥有有关未加密的原始数据的信息,这些信息可用于破解密钥。

于 2009-10-12T20:40:50.350 回答