gpt4 book ai didi

java - 为什么 cipher.getOutputSize() 返回的值高于要求的值?

转载 作者:行者123 更新时间:2023-12-02 02:56:07 26 4
gpt4 key购买 nike

我正在尝试解密使用 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 逐 block 加密,每个 block 的长度必须为 128 位。传入一些不可分割为 128 位 block 的数据意味着必须填充最终的明文 block ,直到其大小达到 128 位。

getOutputSize 返回您应该加密的密文大小。请记住,明文被填充然后加密,因此输入大小与输出大小是相同的。您可以看到这一点,因为 636 mod 16 = 12636 - 12 + 16 = 640。例如。它向上舍入到最接近的 16 倍数,因为这是加密之前包含的额外填充字节数。

由于您在解密时使用此数组,因此该数组比所需的要大,因为您正在分配所需的字节getOutputSize 可用于加密和解密,前提是您知道这是缓冲区分配的“最坏情况”场景。

关于java - 为什么 cipher.getOutputSize() 返回的值高于要求的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43062663/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com