Потоковое шифрование больших файлов в android

Есть необходимость шифровать zip-архив пользовательским паролем. Я нашёл такое решение: https://code.tutsplus.com/ru/tutorials/storing-data-securely-on-android--cms-30558

Есть еще такой вариант: https://stackoverflow.com/questions/30613342/concatenating-mac-and-salt-with-ciphertext

Мне нужно с помощью вводимого пользователем пароля зашифровать zip-архив (как это показано в примере по ссылке), поместив в результирующий зашифрованный файл соль, вектор, и сам зашифрованный контент. Получаю соль byte[256], вектор byte[16], с этим проблем нет. Проблема в том - как записать в один файл соль, вектор и сам зашифрованный контент. В этих примерах, как и во многих других, сначала создается буфер со всем этим содержимым, а потом буфер записывается в файл. Но что, если файл будет большой, например, 2 Гб? Получается при его шифровании весь его контент 2 Гб скопируется в буфер? А если в телефоне всего 2Гб оперативы, оператива исчерпается?

Поэтому я вижу выход в потоковом шифровании из FileInputStream в FileOutputStream с помощью CipherInputStresm или CipherOutputStream c использованием промежуточного буфера размером, наверное, 4096. Я даже и такие примеры находил

https://stackoverflow.com/questions/34361371/android-encryption-large-files

, но там была только запись самого шифра без добавления соли и вектора.

Главная проблема и вопрос: как при таком варианте поточного шифрования (без использования больших буферов в оперативной памяти) поместить в шифрованный файл (а при расшифровке извлечь) соль и вектор? Другими словами - каким способом записывать в один файл (а потом извлекать) соль, вектор и сам шифр?


Ответы (0 шт):