你能从解密算法中得到部分解密的数据吗?

信息安全 爪哇 解密
2021-09-10 18:14:18

我正在使用 Java 和 Apache 最新的带有 128 位 AES 解密的 WSS4J 库来解密一些数据。

我使用正确的填充、解密算法和密码块模式设置了看起来正确的密码。

然后我对加密的数据字节调用 doFinal() 并成功返回一个值。

我的问题是它会返回一个仅部分解密的值吗?

例如,假设前 16 个字节在解密后仍然是混乱的,但返回的数据的其余部分已成功解密,并且那里的预期数据是人类可读的。

这是否意味着我的解密过程可能存在问题?或者,如果解密设置稍有偏差,它甚至无法从 doFinal() 步骤返回一个值?

如果我从 doFinal() 返回一个值,这是否意味着返回的数据 100% 是加密之前的原始数据?

我正在从 Web 服务调用中解密数据,而 Web 服务的所有者声称我在解密过程中一定做错了,并且他们正在正确发送数据。

2个回答

根据您使用的块模式,您可以获得部分解密的数据。例如,在 CBC 模式下,如果提供了不正确的 IV,则第一个数据块将无法正确解密。但是,其余数据将成功解密(假设您使用的是正确的加密密钥)。这是因为块 (x + 1) 的 IV 是块 x 的密文。

维基百科的图表在可视化这方面非常有帮助。

https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation#Cipher_Block_Chaining_.28CBC.29

在此处输入图像描述

一些加密算法需要填充以确保内容的大小是加密算法打算使用的块大小的倍数。如果您的解密过程不处理此填充,则可以在解密结果中看到仍然有乱码字节附加到您的解密消息。通常,此填充出现在消息的左侧,要取回原始明文,您应该遵循一种方法,该方法首先反转填充的附加方式。阅读有关加密填充的更多信息。