Еще раз, приложение C NIST pub 800-38 может быть полезным. Например, согласно этому
Вы можете создать IV для режима CBC, просто зашифровав уникальный одноразовый номер с помощью своего ключа шифрования. Еще проще, если бы вы использовали OFB, тогда IV просто должен быть уникальным.
Существует некоторая путаница относительно того, каковы реальные требования для хороших IV в режиме CBC. Поэтому я считаю полезным кратко остановиться на некоторых причинах этих требований.
Давайте начнем с рассмотрения, почему ИВ даже необходимы. IV рандомизируют шифротекст. Если одно и то же сообщение дважды шифруется одним и тем же ключом (но разными IV), то шифротексты различны. Злоумышленник, которому дано два (одинаково длинных) шифротекста, не сможет определить, зашифрованы ли два шифротекста одним и тем же открытым текстом или двумя разными открытыми текстами. Это свойство обычно называется зашифрованный текст неразличимым .
Очевидно, что это важное свойство для шифрования баз данных, где зашифрованы многие короткие сообщения.
Далее, давайте посмотрим, что может пойти не так, если IV предсказуемы. Давайте для примера возьмем
Предложение Эриксона:
«Вы можете сделать что-то умное, например, сгенерировать одно случайное значение в каждой записи и использовать хеш имени поля и случайного значения для создания IV для этого поля».
Это небезопасно. Для простоты предположим, что у пользователя Алиса есть запись, в которой есть
существует только два возможных значения m1 или m2 для поля F. Пусть Ra будет случайным значением, которое использовалось для шифрования записи Алисы. Тогда зашифрованный текст для поля F будет
E K (хеш (F || Ra) xor m).
Случайный Ra также сохраняется в записи, так как в противном случае было бы невозможно расшифровать. Злоумышленник Ева, который хотел бы узнать значение записи Алисы, может сделать следующее: во-первых, она находит существующую запись, в которую она может добавить выбранное ею значение.
Пусть Re будет случайным значением, используемым для этой записи, и пусть F 'будет полем, для которого Ева может представить свое собственное значение v. Поскольку запись уже существует, можно предсказать IV для поля F', т.е. это
хеш (F '|| Re).
Ева может использовать это, выбрав ее значение v как
v = hash (F '|| Re) xor hash (F || Ra) xor m1,
разрешить базе данных зашифровать это значение, равное
E K (хэш (F || Ra) xor m1)
и затем сравните результат с записью Алисы. Если два результата совпадают, то она знает, что m1 было значением, сохраненным в записи Алисы, иначе это будет m2.
Вы можете найти варианты этой атаки, выполнив поиск «блочно-адаптивная атака с выбранным открытым текстом» (например, эта статья ). Есть даже вариант, который работал против TLS.
Атака может быть предотвращена. Возможно, зашифровав случайное число перед использованием, поместив его в запись, получив IV, зашифровав результат. Но опять же, возможно, самое простое, что предлагает NIST. Создайте уникальный одноразовый номер для каждого поля, которое вы шифруете (это может быть просто счетчик), зашифруйте одноразовый номер с помощью вашего ключа шифрования и используйте результат как IV.
Также обратите внимание, что вышеуказанная атака является выбранной атакой открытым текстом. Еще более опасные атаки возможны, если у злоумышленника есть возможность делать выбранные атаки с шифрованным текстом, то есть, если он может изменить вашу базу данных. Так как я не знаю, как защищены ваши базы данных, трудно предъявлять какие-либо претензии.