在使用加密时,CRC校验冗余吗?

4

我正在使用AES进行加密和CRC检查数据完整性,但我认为在我的情况下CRC检查是多余的。我的操作如下:

加密:

  1. 将有效载荷数据计算CRC
  2. 加密有效载荷数据和CRC

解密:

  1. 解密数据
  2. 新计算有效载荷数据的CRC并与旧CRC进行比较

我想在单元测试中引发CRC检查失败,但当我操纵有效载荷数据时,解密总是会抛出BadPaddingException异常。

我的问题是:如果解密在数据损坏或被篡改时总是抛出此异常(它会吗?),我这种使用方式下的CRC检查是否是多余的?


在加密的第二步中,您加密什么?有效负载+ CRC还是只有有效负载? - Timmos
请展示您所使用的加密/解密方法的代码。 - Andremoniy
@Timmos 我加密了有效载荷+循环冗余校验(见上文) - mithrandir
1
@Andremoniy 我的问题是理论性的 - 在我看来,代码并不会有太大帮助。 - mithrandir
1个回答

3
假设解密不正确的数据是均匀分布的,每255个不正确的密码就有大约1次表现为正确的PKCS5/PKCS7填充。这意味着仍然存在1/255的机会可以正确地进行更改,从而使项目解密成垃圾。因此,您的检查是有必要的。
如果您确实希望得到您所期望的行为,可以使用“AES/CTR/NoPadding”,它不需要精确的块大小,并且始终会返回解密后的字节数组,无论密钥是否匹配。
但是,如果攻击者可以重复地更改密文并让您解密它(例如,可能是存储在cookie中的加密数据),并且如果他们可以区分解密数据因错误填充引发异常时和当其只是垃圾时的行为差异,则他们可以通过“填充预言攻击”确定明文。
您还可以考虑是否需要比CRC更强大的指纹来确保消息完整性,如SHA-256
以上内容主要参考了:AES BadPaddingException

1
谢谢 - 这正是我想知道的! - mithrandir

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接