gpt4 book ai didi

java - Cipher.do最终输出大小

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:03:28 24 4
gpt4 key购买 nike

我正在使用 javax.crypto 在 java 中进行 AES CBC 解密。我正在使用以下 Cipher 类方法:

  • public final void init (int opmode, Key key, AlgorithmParameters params) 初始化方法,
  • final int update(byte[] input, int inputOffset, int inputLen, byte[] output)解密数据的方法,
  • 最后调用final int doFinal(byte[] output, int outputOffset)方法完成解密。

我的查询是这样的:我可以假设 doFinal 调用返回给我的数据大小总是小于或等于 AES block 大小吗?文档将 doFinal 方法描述为:

“Finishes a multi-part transformation (encryption or decryption). Processes any bytes that may have been buffered in previous update calls. The final transformed bytes are stored in the output buffer.”

但它没有说输出缓冲区最多包含一个数据 block 。虽然我知道这是 AES API 的一般行为,而且这是我的代码迄今为止表现出的行为,但这种假设是否始终成立?

最佳答案

general 中(如在 Cipher 类的上下文中)我不认为这样假设是安全的。根据 javadocs对于 doFinal 方法:

If the output buffer is too small 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.

因此,如果您在调用 doFinal 方法的“附近”分配输出缓冲区,那么调用 getOutputSize 并分配适当大小的缓冲区是有意义的。工作完成。

另一方面,如果您从“远处”传入一个缓冲区,该缓冲区的创建恰好是 block 大小,您可能会遇到更多麻烦。密码实现返回大于 block 大小的输出是完全合法的(至少,根据 Java 类的公共(public)接口(interface)),只要 getOutputSize 方法返回适当的大小。

事实上,如果您要进行 CBC 解密,那不是要求您将 所有 block 传递给 update 方法吗?在这种情况下,您应该从 doFinal 获得完整的明文输出,而不仅仅是一个 block ?

关于java - Cipher.do最终输出大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3475761/

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