4

我使用 AES 进行加密,使用 CRC 来检查数据完整性,我的印象是 CRC 检查在我的情况下是多余的。我正在执行以下操作:

加密:

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

解密:

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

我想在我的单元测试中引发 CRC 检查失败,但是当我操作有效负载数据时,解密总是会引发 BadPaddingException。

我的问题是:如果解密总是在数据被损坏或被操纵时抛出这个异常(会吗?)不是我使用它的方式冗余的 CRC 检查吗?

4

1 回答 1

3

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

如果你真的想要你所期望的行为,你可以使用“AES/CTR/NoPadding”,它不需要确切的块大小,并且总是返回一个解密的字节[],无论密钥是否匹配。

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

您可能还需要考虑是否可以使用比 CRC 更强大的指纹(如SHA-256)来确保消息完整性。

很多这样的重复来自:AES BadPaddingException

于 2013-01-11T11:35:16.860 回答