Cipher.dofinal()出现内存不足错误

时间:2016-09-20 11:56:11

标签: android encryption out-of-memory

我正在开发一个Android应用程序,我使用Cipher Class of Android解密大文件。

代码:

private byte[] decrypt_chunk(byte[] data, ByteString chunk_encryption_key) {
        SecretKeySpec skeySpec = new SecretKeySpec(chunk_encryption_key.toByteArray(), 1, 16, "AES");
        Cipher cipher;
        byte[] decrypted = new byte[0];
        try {
            cipher = Cipher.getInstance("AES/CFB/NoPadding");

            cipher.init(Cipher.DECRYPT_MODE, skeySpec, new IvParameterSpec(getIV(0)));

            decrypted = cipher.doFinal(data);

        } catch (NoSuchAlgorithmException | NoSuchPaddingException e) {
            e.printStackTrace();
        } catch (InvalidKeyException e) {
            e.printStackTrace();
        }  catch (InvalidAlgorithmParameterException e) {
            e.printStackTrace();
        } catch (ShortBufferException e) {
            e.printStackTrace();
        }

        return decrypted;
    }

我在解密大文件时遇到“OutOfMemory”错误。

我有以下问题:

  1. 当前代码中的哪些字符可以修复 OOM错误

  2. Cipher.update()可以帮助解决问题吗?如果是的话,如何实施呢?

  3. 谢谢。

1 个答案:

答案 0 :(得分:3)

使用Cipher.update()方法是一种可行的方法。

但是,在您的情况下,我建议您使用CipherOutputStream代替。我假设您有一个用于从服务器检索数据的InputStream和一个用于将数据保存到文件中的FileOutputStream。

使用CipherOutputStream非常简单,只需在FileOutputStream周围“包装”:

FileOutputStream fout = ...
CipherOutputStream cout = new CipherOutputStream(fout, cipher);

现在继续使用cout代替fout,您写入的内容将自动加密。