2013-09-06 3 views
4

Итак, у меня есть эти большие файлы (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)); 
    } 
    } 
+0

Этот вопрос может помочь http://stackoverflow.com/questions/11300128/encrypting-and-or-decrypting-large-files-aes-on-a-memory-and-storage-constrain –

+1

Возможно, это имеет смысл использовать только 'doFinal' на последнем куске. По умолчанию вы будете использовать 'update (byte [], int, int, byte [], int)' для многочастных операций. Это позаботится о частичных границах для вас. – afk5min

+0

Никогда не думал об этом> _ <Позвольте мне проверить, есть ли другие методы, кроме doFinal, которые я могу использовать. – Sanchit

ответ

3

Рассмотрите возможность использования Cipher#update(byte[], int, int, byte[], int) вместо doFinal() для многоэлементных операций. Это позаботится о частичных границах для вас.

Последняя часть дешифрованных данных может быть получена путем вызова метода doFinal(byte[] output, int outputOffset).

+0

Да, спасибо. Глупый я, забыл об этом методе обновления. Благодаря! Легкая проблема. – Sanchit

Смежные вопросы