[英]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; 來自評論:
表明這可能是運行時 27 及之前版本中的錯誤。 據推測,它在以后的版本中得到了修復,盡管錯誤報告沒有說明是哪個版本。
但是,也許最好使用增量更新來解決問題。 在這種情況下,請確保您的緩沖區嚴格低於 64KiB,比如 32KiB。
基本上,在 Java 中,有兩種方法可以執行增量加密。 一種是簡單地使用許多Cipher.update
方法之一,並從緩沖區提供文本(並注意Cipher.update
返回部分密文,當它變得可用時)。 然后您需要使用doFinal()
方法完成加密。
另一種是使用流媒體。 對於加密,您通常會使用CipherOutputStream
然后將明文復制到其中,手動(再次使用緩沖區,就像您現在所做的那樣)或者如果您想寫入整個流,只需執行InputStream.transferTo
方法。 在這種情況下,您可能希望直接從資源中讀取字節(保持原始編碼)。 但是,在這種情況下,您不知道它將使用什么緩沖區大小。 如果您需要流式傳輸,那么使用update
/ doFinal
調用創建自己的流式傳輸類相對容易。
使用輸入和輸出緩沖區 ( ByteBuffer
) 使用doFinal
似乎仍會觸發錯誤,因此不起作用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.