gpt4 book ai didi

java - 加密大字节数组

转载 作者:行者123 更新时间:2023-12-02 14:10:13 25 4
gpt4 key购买 nike

我正在使用Cipher进行加密/解密。它一直都很好,但现在我在处理大数组字节时遇到问题。

这是我的实现:

val cipher = Cipher.getInstance("AES/GCM/NoPadding")
cipher.init(Cipher.ENCRYPT_MODE, getSecretKey())
val encryptedData = cipher.doFinal(textToEncrypt.toByteArray(StandardCharsets.UTF_8))

如上所述,仅当输入文本太大时才会出现问题。例如,如果我将长度为 168036 的字节数组作为 doFinal 的输入传递,它将返回一个长度为 65652 的字节数组。

这与密码的限制有关吗?如果是这样,有没有办法增加输入缓冲区?

enter image description here

最佳答案

GVillani82 表明他拥有一些严肃的 Google-Fu;来自评论:

"Maybe related with this https://issuetracker.google.com/issues/123307358 ?"

表明这可能是运行时 27 及之前版本中的错误。尽管错误报告没有说明哪个版本,但大概它在更高版本中得到了修复。

<小时/>

但是,也许使用增量更新来解决问题会更好。在这种情况下,请确保您的缓冲区严格低于 64KiB,例如 32KiB。

基本上,在 Java 中,有两种方法可以执行增量加密。一种是简单地使用众多 Cipher.update 之一方法,并从缓冲区提供文本(请注意 Cipher.update 在可用时返回部分密文)。然后您需要使用 doFinal() 完成加密方法。

另一种是使用流式传输。对于加密,您通常使用 CipherOutputStream然后将明文复制到其中,手动(再次使用缓冲区,就像您现在所做的那样)或简单地执行 InputStream.transferTo方法,如果你想写整个流。在这种情况下,您可能希望直接从资源读取字节(保留原始编码)。但是,在这种情况下,您不知道它将使用什么缓冲区大小。如果您需要流式传输,那么使用update创建您自己的流式传输类相对容易。/doFinal来电。

使用doFinal使用输入和输出缓冲区( ByteBuffer )似乎仍然会触发错误,因此这不起作用。

关于java - 加密大字节数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60620566/

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