#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 для получения подробной информации.