我正在尝试解密使用AES256 CBC加密的文件,这是我的代码:
PaddedBufferedBlockCipher cipher = new PaddedBufferedBlockCipher(new CBCBlockCipher(new AESFastEngine()));
cipher.init(false, new ParametersWithIV(new KeyParameter(key), iv));
byte[] outBuf = new byte[cipher.getOutputSize(data.length)];
int processed = cipher.processBytes(data, 0, data.length, outBuf, 0);
processed += cipher.doFinal(outBuf, processed);
这很简单,但是
cipher.getOutputSize(data.length)
总是返回大于所需值的值。我总是在缓冲区末尾出现一些奇怪的字符。我试图解密两个html文件,这是它们的结尾:
</HTML>����������������
// Processed: 9304 Size: 9312
和
</body></html>��������
// Processed: 636 Buffer size: 640
因此,额外的字节大小不一致,我不能仅将“字节数”递减。
计算输出数组的大小时我在做什么错?
最佳答案
与填充有关。
AES逐块加密,每个块的长度必须为128位。传递一些不可分割为128位块的数据意味着必须填充最后一个明文块,直到其大小为128位。getOutputSize
将返回您应该加密的密文大小。请记住,先填充明文,然后再加密,因此输入大小与输出大小相同。您可以看到此内容,因为636 mod 16 = 12
和636 - 12 + 16 = 640
。例如。它四舍五入到最接近的16的倍数,因为这是加密之前包含了多少额外的填充字节。
由于在解密时使用该数组,因此该数组大于所需的数组,因为您正在分配所需的字节。 getOutputSize
可以用于加密和解密,前提是您知道这是缓冲区分配的“最坏情况”方案。
关于java - 为什么cipher.getOutputSize()返回的值会比要求的高?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43062663/