我正在开发一个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”错误。
我有以下问题:
当前代码中的哪些字符可以修复 OOM错误?
Cipher.update()可以帮助解决问题吗?如果是的话,如何实施呢?
谢谢。
答案 0 :(得分:3)
使用Cipher.update()方法是一种可行的方法。
但是,在您的情况下,我建议您使用CipherOutputStream
代替。我假设您有一个用于从服务器检索数据的InputStream和一个用于将数据保存到文件中的FileOutputStream。
使用CipherOutputStream非常简单,只需在FileOutputStream周围“包装”:
FileOutputStream fout = ...
CipherOutputStream cout = new CipherOutputStream(fout, cipher);
现在继续使用cout
代替fout
,您写入的内容将自动加密。