Я должен защитить конфиденциальность, целостность и подлинность файла записей с помощью пароля. Количество записей потенциально может быть больше 32^2, и к каждой записи можно получить доступ независимо.
Одним из способов его реализации является
- Создайте 256-битную случайную соль и сохраните ее в заголовке файла.
- Сгенерируйте производный ключ из пароля и соли, используя PBKDF2 с HMAC-SHA256 из PKCS #5.
- Для каждой записи сгенерируйте 96-битный случайный вектор инициализации.
- Зашифруйте содержимое каждой записи с помощью AES-256 в режиме GCM, используя производный ключ, вектор инициализации и (в качестве дополнительных аутентифицированных данных) положение записи в файле.
- В результате каждая запись будет хранить вектор инициализации, зашифрованное содержимое и MAC.
Но Специальная публикация NIST SP800-38D, определяющая GCM и GMAC требует, чтобы количество записей было меньше 32^2, чтобы векторы инициализации были уникальными.
Поэтому я придумал другое решение: создать ключ для каждой записи с помощью HMAC-SHA256, используя производный ключ в качестве ключа и положение записи в файле в качестве сообщения для аутентификации (соль).
Итак, вопрос в том, нужно ли мне предоставлять позицию записи в файле для аутентифицированного алгоритма шифрования в качестве дополнительных аутентифицированных данных, поскольку я уже позаботился об этом при создании ключа?
Кроме того, мне действительно нужно вообще использовать векторы инициализации, поскольку все записи будут зашифрованы и аутентифицированы с использованием предположительно разных ключей, сгенерированных HMAC-SHA256 (PBKDF2 (HMAC-SHA256, пароль, соль, iterationCount, 256), blockAddress)?
Я не знаю, каков будет размер файла, поэтому я предполагаю, что он может быть очень большим.