Основная проблема с неслучайным IV заключается в том, что два идентичных начальных блока, зашифрованных одним и тем же ключом, будут давать одинаковые выходные данные. Итак, учитывая ваше описание произведений Гамлета, зная, что вы неоднократно используете один и тот же IV, я бы сделал следующее:
- Я бы вычислил зашифрованный текст для «Быть или не быть» (16 байт) для широкого спектра вероятных паролей (которые могут быть сгенерированы Джоном Потрошителем).
- Я бы сравнил результирующий Ciptext со всеми сообщениями, исходя из предпосылки, что они могут начинаться с этих 16 байтов.
- Если кто-то совпадает, я знаю пароль. Готово.
Я бы сделал то же самое с несколькими другими известными фразами. Это операция, которую я могу выполнять параллельно, даже до того, как записать ваш файл и кеш в базу данных. Общий термин для этого подхода - радужный стол .
Моя работа становится намного, намного проще, если я случайно узнаю первые 16 байтов ваших сообщений (например, если это сообщения электронной почты известному человеку или HTTP-запросы с известными заголовками или тому подобное).
Но что, если вы используете случайные ключи (или правильный KDF, такой как PBKDF2)? Хорошо, скажем, у меня есть несколько сообщений от вас, и по крайней мере некоторые из них имеют те же первые 16 байтов (опять же, заголовки в протоколе мне очень помогают здесь). Ну, первый шаг - я знаю, что эти сообщения имеют одинаковые первые 16 байтов. Это довольно полезная информация. А теперь у меня есть детская кроватка для атаки на ваши сообщения.
Повторное использование ключа IV + в CBC не полностью разрушает его безопасность (как повторное использование ключа Nonce + в режиме CTR). Но это дает атакующему множество полезных инструментов для упрощения атаки.
Я не говорю, что любой из них позволит вам расшифровать ваш конкретный зашифрованный текст за короткий промежуток времени. Но все они сильно ухудшают предполагаемую криптографию AES.