簡體   English   中英

加密大字節數組

[英]Encrypting large byte array

我正在使用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 的字節數組。

這與密碼的限制有關嗎? 如果是這樣,有沒有辦法增加輸入緩沖區?

在此處輸入圖片說明

GVillani82 顯示他擁有一些嚴肅的 Google-Fu; 來自評論:

“也許與這個https://issuetracker.google.com/issues/123307358 有關?”

表明這可能是運行時 27 及之前版本中的錯誤。 據推測,它在以后的版本中得到了修復,盡管錯誤報告沒有說明是哪個版本。


但是,也許最好使用增量更新來解決問題。 在這種情況下,請確保您的緩沖區嚴格低於 64KiB,比如 32KiB。

基本上,在 Java 中,有兩種方法可以執行增量加密 一種是簡單地使用許多Cipher.update方法之一,並從緩沖區提供文本(並注意Cipher.update返回部分密文,當它變得可用時)。 然后您需要使用doFinal()方法完成加密。

另一種是使用流媒體。 對於加密,您通常會使用CipherOutputStream然后將明文復制到其中,手動(再次使用緩沖區,就像您現在所做的那樣)或者如果您想寫入整個流,只需執行InputStream.transferTo方法。 在這種情況下,您可能希望直接從資源中讀取字節(保持原始編碼)。 但是,在這種情況下,您不知道它將使用什么緩沖區大小。 如果您需要流式傳輸,那么使用update / doFinal調用創建自己的流式傳輸類相對容易。

使用輸入和輸出緩沖區 ( ByteBuffer ) 使用doFinal似乎仍會觸發錯誤,因此不起作用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM