Шифрование больших файлов (2 ГБ) с использованием AES / CBC / PKCS5Padding

#java #encryption #aes

#java #шифрование #aes

Вопрос:

У меня очень большой файл, около 2 ГБ, и я хочу зашифровать его, разрезав на куски, если я прочитаю его сразу, он слишком большой, и моя JVM выдает ошибку OutOfMemory. Я использую AES / CBC / PKCS5Padding. Можете ли вы порекомендовать мне способ сделать это? Я читал о потоках шифрования, но я не уверен, будут ли они работать. Заранее спасибо! Я использую эту стратегию прямо сейчас, но она не работает для файлов большего размера.

   try (FileInputStream input = new FileInputStream(in);
                 FileOutputStream output = new FileOutputStream(out)) {
                byte[] encoded = cipher.doFinal(ByteStreams.toByteArray(input));
                output.write(encoded);
            }
  

Комментарии:

1. Проблема в Java. Java сохраняет все, а затем шифрует. Почему вы не используете аутентифицированное шифрование, такое как AES-GCM?

2. @kelalaka Java не хранит все файлы, а затем шифрует их при Cipher*Stream правильном использовании. AES-GCM, однако, не подходит для таких больших файлов, как этот. Это единственный случай, когда я бы рекомендовал CBC HMAC вместо GCM.

3. Взгляните на cipher. update(..) метод, он помогает вам расшифровывать поток по частям (просто не считывайте весь файл в память)

Ответ №1:

Создайте CipherOutputStream обертку вашего FileOuputStream .

Используйте Files.copy() для копирования вашего файла в это CipherOutputStream .

Выполнено. Прочитайте javadoc для получения подробной информации.