Вам следует подумать о записи расшифрованных данных во временный файл, а затем перезагрузить данные для использования.
Основными причинами ошибки Out of memory являются ByteArrayOutputStream AND byte [] decryptedData = buffer.toByteArray ( ), потому что они оба содержат полные (расшифрованные) данные , и это удваивает потребление памяти вашим методом дешифрования.
Этого можно избежать, расшифровав данные во временный файл в первом step, а затем загрузите данные из временного файла. Я изменил метод дешифрования для обработки дешифрованного выходного потока, а позже появился метод для перезагрузки дешифрованных данных (нет соответствующей обработки исключений, и для моего тестирования я устанавливаю переменную stati c encryptPassword ...).
Осталась только одна часть - вам нужно найти хорошее место для временного файла, а я не Android специалист.
Всего два примечания: вы используете небезопасный режим AES ECB и преобразование строки в байт [] для вашего пароля следует изменить на
.getBytes(StandardCharsets.UTF_8)
на стороне шифрования и дешифрования, чтобы избежать ошибок, вызванных различными кодировками на разных платформах.
public static void decryptNew(File files, File tempfiles) {
try (FileInputStream fis = new FileInputStream(files);
BufferedInputStream in = new BufferedInputStream(fis);
FileOutputStream out = new FileOutputStream(tempfiles);
BufferedOutputStream bos = new BufferedOutputStream(out)) {
byte[] ibuf = new byte[1024];
int len;
Cipher cipher = Cipher.getInstance("AES");
SecretKeySpec sks = new SecretKeySpec(encryptPassword.getBytes(),"AES"); // static password
// SecretKeySpec sks = new SecretKeySpec(getResources().getString(R.string.encryptPassword).getBytes(),"AES");
cipher.init(Cipher.DECRYPT_MODE, sks);
while ((len = in.read(ibuf)) != -1) {
byte[] obuf = cipher.update(ibuf, 0, len);
if (obuf != null)
bos.write(obuf);
}
byte[] obuf = cipher.doFinal();
if (obuf != null)
bos.write(obuf);
} catch (BadPaddingException | IllegalBlockSizeException | InvalidKeyException | IOException | NoSuchAlgorithmException | NoSuchPaddingException e) {
e.printStackTrace();
}
}
public static byte[] loadFile(File filename) throws IOException {
byte[] filecontent = new byte[0];
FileInputStream fileInputStream = null;
try {
fileInputStream = new FileInputStream(filename);
// int byteLength = fff.length();
// In android the result of file.length() is long
long byteLength = filename.length(); // byte count of the file-content
filecontent = new byte[(int) byteLength];
fileInputStream.read(filecontent, 0, (int) byteLength);
} catch (IOException e) {
e.printStackTrace();
fileInputStream.close();
return filecontent;
}
fileInputStream.close();
return filecontent;
}
После загрузки содержимого временного файла в массив байтов вы можете удалить файл однострочным (опять же без обработки исключений):
Files.deleteIfExists(tempFile.toPath());