gpt4 book ai didi

java - javax.crypto.Cipher 的输出灵活性,re : fixed-size ByteBuffers

转载 作者:行者123 更新时间:2023-12-01 05:04:46 25 4
gpt4 key购买 nike

有谁知道是否可以使用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可从池中的固定大小缓冲区中获取。在这种情况下,根据这两种方法的文档:

If output.remaining() bytes are insufficient to hold the result, a ShortBufferException is thrown. In this case, repeat this call with a larger output buffer. Use getOutputSize to determine how big the output buffer should be.

有谁知道是否有办法解决这个问题?也许有某种方法可以在 update() 调用之间刷新加密数据,以防止缓冲区积累过多......?我还没有尝试 CipherOutputStream。同样,关键目标是直接用加密数据填充一系列固定大小的 ByteBuffer,而不分配/填充中间字节数组。

最佳答案

如果数据是任意的,那为什么需要加密呢?只需生成一些随机数据并将其输入字节数组即可。为了加密安全,只需使用像 SecureRandom 这样的加密质量 RNG。它可用于生成所需数量的字节,请参阅 SecureRandom.nextBytes()

否则,我认为您已经提到了问题的解决方案:CipherOutputStream

关于java - javax.crypto.Cipher 的输出灵活性,re : fixed-size ByteBuffers,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12881517/

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