Я разрабатываю процедуру и формат файла для приложения шифрования. Я пришел к моменту, когда мне нужно принять решение относительно метода / рабочего процесса шифрования. Я не могу определиться с преимуществами и недостатками использования одного подхода над другим.
Ниже приведен обзор структуры формата:
------------------------------------------
| File signature || fixed | plain |
|----------------||----------|-----------|
| Algorithm info || fixed | plain |
|----------------||----------|-----------|
| Seed || fixed | encrypted |
|----------------||----------|-----------|
| Data || variable | encrypted |
|----------------||----------|-----------|
| CRC || fixed | encrypted |
------------------------------------------
Изначально я собираюсь использовать SHA-256 для хэш-функции и AES-256 для алгоритма шифрования, но позже он будет настраиваться, как предполагает формат.
Предлагаемая процедура создания зашифрованного контейнера:
- Хэш (Пароль) => Ключ доступа
- Создать случайное семя
- Key-Pass XOR Seed => Сеялки с ключом
- Зашифруйте семя с помощью Key-Pass и сохраните зашифрованное семя
- Шифрование данных с помощью ключа и сохранение зашифрованных данных
- Шифрование CRC с помощью Key-Seded и сохранение зашифрованного CRC
Вопросы
A. Получу ли я что-нибудь от хранения зашифрованных семян и CRC? Будет ли это менее безопасно, если я буду хранить их без шифрования?
B. Более или менее или нет различий в безопасности использования [Hash (Password + Seed)] для генерации ключа, а не использования [Hash (Password) XOR Seed] для окончательного ключа?
C. Заключительный вопрос из двух вопросов выше. Будет ли лучше или хуже использовать альтернативную процедуру создания зашифрованного контейнера:
- Хеш (Пароль + Семя) => Ключ
- Хранить незашифрованное семя
- Шифрование данных с помощью ключа и сохранение зашифрованных данных
- Хранить незашифрованный CRC (или зашифрованный)
Полагаю, мне нужно было бы хранить незашифрованное семя, чтобы восстановить ключ при считывании зашифрованного содержимого. CRC может быть зашифрован или незашифрован.