Итак, у меня есть эти большие файлы (6 ГБ +), которые мне нужно расшифровать на 32-битном компьютере. Общая процедура, которую я использовал ранее, состояла в том, чтобы прочитать весь файл в памяти, затем передать его функции расшифровки, а затем записать все обратно в файл. Это не работает из-за ограничений памяти. Я попытался передать файл по частям в функцию расшифровки, но, похоже, он испортил границы того, где я разбиваю файл перед отправкой его в функцию дешифрования.Расшифровать файл по частям
Я пробовал разбивать файл по частям относительно размера ключа, но это, похоже, не имеет значения. Я попробовал массив байтов размером 2048, а также байт-арай размером 294, думая, что это может быть специальная граница, но не повезло. Я могу видеть части файла правильно дешифрованные, но части, которые являются общей тарабарщиной.
Невозможно ли расшифровать файл в кусках? Если есть способ, то как?
Вот моя функция дешифрования/моя попытка расшифровать по частям.
private Path outFile;
private void decryptFile(FileInputStream fis, byte[] initVector, byte[] aesKey, long used) {
//Assume used = 0 for this function.
byte[] chunks = new byte[2048]; //If this number is greater than or equal to the size of the file then we are good.
try {
if (outFile.toFile().exists())
outFile.toFile().delete();
outFile.toFile().createNewFile();
FileOutputStream fos = new FileOutputStream(outFile.toFile());
OutputStreamWriter out = new OutputStreamWriter(fos);
IvParameterSpec spec = new IvParameterSpec(Arrays.copyOfRange(initVector, 0, 16));
SecretKeySpec key = new SecretKeySpec(aesKey, "AES");
Cipher cipher = Cipher.getInstance("AES/CFB/NoPadding");
cipher.init(Cipher.DECRYPT_MODE, key, spec);
int x;
while ((x = fis.read(chunks, 0, chunks.length)) != -1) {
byte[] dec = cipher.doFinal(Arrays.copyOfRange(chunks, 0, x));
out.append(new String(dec));
}
out.close();
fos.close();
} catch (Exception e) {
e.printStackTrace();
LOG.error(ExceptionUtils.getStackTrace(e));
}
}
Этот вопрос может помочь http://stackoverflow.com/questions/11300128/encrypting-and-or-decrypting-large-files-aes-on-a-memory-and-storage-constrain –
Возможно, это имеет смысл использовать только 'doFinal' на последнем куске. По умолчанию вы будете использовать 'update (byte [], int, int, byte [], int)' для многочастных операций. Это позаботится о частичных границах для вас. – afk5min
Никогда не думал об этом> _ <Позвольте мне проверить, есть ли другие методы, кроме doFinal, которые я могу использовать. – Sanchit