【问题标题】:Does Rijndael always throw an exception if the password isn't correct?如果密码不正确,Rijndael 是否总是抛出异常?
【发布时间】:2010-12-06 02:44:51
【问题描述】:

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

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

这是 100% 的真实情况吗?我可以取消校验和而只捕获异常吗?

【问题讨论】:

    标签: .net encryption passwords rijndaelmanaged


    【解决方案1】:

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

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

    【讨论】:

    • 我完全控制了加密图像;用户只能向我提供未加密的图像和密码,用于生成密钥和 IV 进行加密。你的意思是我应该在加密之前将图像与已知字节连接起来,然后在解密后检查这些字节?
    • 是的。如果您在前面附加已知字节,则只需解密第一个块即可验证密钥/数据组合。
    • 呃,不幸的是我无法正确执行此操作。我以为我可以只使用 TransformBlock 并取出前 256 个字节(块大小设置为 256),但实际上我得到的比这少。我只需要解密整个事情,将加密异常捕获/重新包装为无效传递异常,然后剥离我的检查块并检查它。
    • 块为 8 字节,256 。您应该可以,只需确保将“最后一个块”作为假传递,然后从字节 9 开始恢复。我没有任何方便的代码,我自己总是使用 Crypto API 在 C/C++ 中执行此操作,但我知道 .net 类也支持此操作。还要确保您在第一个具有正确密钥状态的块后恢复:IV 和 CBC 模式将在您解密块 1 后将密钥置于正确的状态以解密块 2,除非您再次解密,否则您无法使用新的密钥实例恢复块 1。
    • 我认为填充意外正确的“概率非常低”。例如,如果解密文本的最后一个字节是 0x01,那么它将被认为是有效的 PKCS7 填充;这将发生大约 1/256 的时间(最后两个字节随机 0x0202 的概率仅为 1/2^16,当然对于更长的填充字符串会减少)。由于如果密钥不正确,Rijndael 的行为应该与随机映射完全一样,因此无论原始输入是什么,填充都将在大约 1/256 的时间内被视为有效。
    【解决方案2】:

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

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

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

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

    【讨论】:

    • Rfc2898DeriveBytes 用于从密码和盐创建您的密钥和 IV。
    • 在 MD5 上拍摄的点。如果我真的走这条路,我至少会切换到 SHA512。
    • @Will:关键是散列不是加密。通过保留有关加密数据的未加密信息,您将大大降低加密强度。
    • 是的,我知道散列不是加密。我也知道有 AES 加密文件和未加密的同一文件的 SHA512 哈希值的人解密原始文件的机会稍大一些,但我相信风险可能意味着 200 年下降十年采取破解加密。关键是我必须找到某种方法来减少或消除在打印过程中浪费一千美元的机会,因为图像被错误的密码解密并且没有引发异常。
    • 使用检查块并删除 sha 哈希。这次你赢了,Guffa
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多