Мне нужно создать собственный формат файла (байт) для Android-приложения. Основными задачами форматов являются сохранение зашифрованного файла AES (байтовые данные) и некоторые метаданные, необходимые для его расшифровки (например, IV, Salt и несколько параметров приложения).Правильная обработка собственного формата файла в Java
У меня есть несколько вопросов о том, как разработать и осуществить это:
- Каковы обязательные поля в файле?
Текущая идея состоит в том, чтобы начать с 4 байтов магического номера, а затем номер версии формата. Затем следуют IV и Соль. Затем я бы включил контрольную сумму первых 4kb исходных (незашифрованных) данных, поэтому я могу быстро расшифровать только первые 4kb и проверить, был ли предоставленный ключ правильным. Затем контрольная сумма всех исходных (незашифрованных) данных, чтобы я мог также проверить весь файл. Это он для заголовка. (Нужна ли длина ((un) зашифрованных) данных? Смещение к данным? Контрольная сумма для всего файла (заголовок + тело)?)
Для тела (которое теперь зашифровано) я хотел бы добавить оригинальное имя файла и расширение (сколько байтов должно использоваться для этого?). Тогда исходный файл.
- Каков наилучший способ для чтения/записи таких байт-файлов на Java?
Два основных метода, которые я нашел: ByteArrayOutputStreams и RandomAccessFiles. С первым вариантом я пропускаю опцию поиска, например, как можно писать в определенной позиции (т. Е. Для контрольной суммы)? Второй, похоже, работает хорошо, но, возможно, есть более доступные решения.
[консенсус] (http://crypto.stackexchange.com/q/202/13022) заключается в том, что вы должны использовать encrypt-then-MAC, а не MAC-then-encrypt (это то, что вы предлагаете) , Это означает, что вы запускаете полученный шифротекст AES с помощью сильного алгоритма MAC, такого как HMAC-SHA256.Остается вопрос, как получить ключ, который будет использоваться для алгоритма MAC. –