使用加密时CRC校验是否冗余?

时间:2013-01-11 11:19:31

标签: java encryption crc

我使用AES加密和CRC来检查数据完整性,我的印象是在我的情况下CRC校验是多余的。我正在做以下事情:

加密:

  1. 获取有效载荷数据并从中计算CRC
  2. 加密有效载荷数据加CRC
  3. 解密:

    1. 解密数据
    2. 计算有效载荷数据的新CRC并将其与旧CRC进行比较
    3. 我想在单元测试中引发CRC校验失败但是当我操作有效负载数据时,解密总是抛出BadPaddingException。

      我的问题是:如果解密总是在数据被破坏或被操纵时抛出此异常(是吗?)CRC校验不是我使用它的方式多余吗?

1 个答案:

答案 0 :(得分:2)

假设错误解密的数据是均匀分布的,那么对于每255个不正确的密码,它看起来是正确的PKCS5 / PKCS7填充大约1次。这意味着仍有1/255的可能性会发生正确的更改,并且该项目将解密为垃圾。因此,您的支票不是浪费。

如果您确实需要预期的行为,可以使用“AES / CTR / NoPadding”,它不需要精确的块大小,并且无论密钥是否匹配,都将始终返回解密的byte []。

但是,如果攻击者可以反复更改密文并让您对其进行解密(例如,可能是存储在cookie中的加密数据),并且如果他们可以在解密数据引发错误填充的异常时区分您的行为,当它只是垃圾时,他们可以通过“填充oracle攻击”确定明文。

您可能还想考虑一个比CRC更强大的指纹是否合适,如SHA-256,以确保消息的完整性。

AES BadPaddingException

重复了很多这样的事情