有谁知道是否可以使用javax.crypto.Cipher类用任意数量的加密数据逐步填充固定大小的 ByteBuffers(池化缓冲区)的顺序链?也就是说,无需分配和填充任何其他中间缓冲区数组。我的特殊情况的加密是 CBC 模式下的 AES。
我希望有类似于 CharsetEncoder 的 encode(CharBuffer input, ByteBuffer output, boolean endOfInput) 方法的东西,它可以很好地控制写入输出,包括写入到给定限制和根据需要在输出缓冲区之间切换的能力。
从表面上看,这似乎可以使用 Cipher 的update(ByteBuffer input, ByteBuffer output)方法来实现,其中输入的限制已在调用之前设置,即。以避免超出输出缓冲区的容量。如果我正确理解 API 文档,Cipher 实现可能会在调用此方法之间缓冲任何数量的加密数据,因此可以想象,对 update() 或 doFinal() 的单个调用可能需要输出 ByteBuffer 的容量大于可从池中的固定大小缓冲区中获得。在这种情况下,根据这两种方法的文档:
如果 output.remaining() 字节不足以容纳结果,则会抛出 ShortBufferException。在这种情况下,使用更大的输出缓冲区重复此调用。使用 getOutputSize 确定输出缓冲区的大小。
有谁知道是否有办法解决这个问题?也许某种方式在 update() 调用之间刷新加密数据以防止过多的缓冲区积累......?我还没有走上尝试 CipherOutputStream 的道路。同样,关键目标是使用加密数据直接填充一系列固定大小的 ByteBuffer,而无需分配/填充中间字节数组。