В режимах блочного шифрования, таких как AES-CBC, вектор инициализации (IV, Initialization Vector) играет критическую роль в обеспечении семантической безопасности. В библиотеке CryptoJS его неправильное использование, особенно фиксация одного и того же IV для множества операций шифрования, приводит к предсказуемым и часто катастрофическим последствиям для криптографической стойкости системы.
В режиме CBC каждый блок открытого текста перед шифрованием XOR-ится с предыдущим блоком шифротекста. Для первого блока используется IV:
C_1 = E_K(P_1 IV)
Далее:
C_i = E_K(P_i C_{i-1})
IV не является секретом, но он обязан быть случайным и уникальным для каждого шифрования при одном и том же ключе. Его задача — гарантировать, что одинаковые сообщения дают разные шифротексты.
В CryptoJS разработчики часто используют конструкцию:
CryptoJS.AES.encrypt(message, key, {
iv: CryptoJS.enc.Hex.parse("00000000000000000000000000000000")
});
или любой другой статически заданный IV.
Такое решение приводит к тому, что система теряет одно из ключевых свойств криптографии — недетерминированность.
Если шифрование выполняется несколько раз с одним ключом и фиксированным IV:
ciphertext1 = AES(key, iv_fixed, "secret message");
ciphertext2 = AES(key, iv_fixed, "secret message");
результат будет идентичен:
ciphertext1 == ciphertext2
Фиксированный IV делает шифрование детерминированным. Это означает, что атакующий может:
Особенно критично это в случаях, когда данные имеют структурированную природу: JSON, токены, идентификаторы, HTTP-заголовки.
Даже без знания ключа фиксированный IV позволяет наблюдать закономерности:
Пример:
AES(key, iv_fixed, "user=alex&role=admin")
AES(key, iv_fixed, "user=alex&role=user")
Различие будет локализовано только в изменённых блоках, остальные части останутся коррелированными.
Это приводит к утечке метаданных, даже если содержимое формально зашифровано.
При фиксированном IV атакующий может:
Это особенно опасно в системах логирования, API-запросов и токенизации данных.
Криптографическая стойкость по определению IND-CPA (indistinguishability under chosen plaintext attack) требует, чтобы шифрование одного и того же сообщения давало разные результаты при каждом вызове.
Фиксированный IV полностью разрушает это свойство. Атакующий, имея возможность шифровать произвольные сообщения, может различать зашифрованные данные и строить выводы о содержимом.
Если атакующий может влиять на часть входного сообщения (например, через форму ввода или API), фиксированный IV позволяет:
В сочетании с предсказуемой структурой сообщений это превращается в инструмент частичной криптоаналитики.
Особенно опасная комбинация:
В этом случае разные пользователи начинают генерировать коррелированные шифротексты, что позволяет атакующему:
На практике фиксированный IV часто появляется из-за:
Типичный антипример:
const iv = CryptoJS.enc.Hex.parse("00000000000000000000000000000000");
function encrypt(data, key) {
return CryptoJS.AES.encrypt(data, key, { iv }).toString();
}
Такой код внешне корректен, но криптографически уязвим.
Фиксированный IV влияет не только на теоретическую безопасность, но и на прикладные системы:
Важно, что сам ключ может оставаться неизвестным атакующему, но система всё равно оказывается скомпрометированной на уровне метаданных.
При фиксированном IV любые дополнительные утечки (например, сообщения об ошибках расшифровки, различия во времени обработки) усиливают атакуемость системы. В некоторых конфигурациях это приближает систему к условиям padding oracle, где даже минимальная обратная связь от сервера позволяет постепенно восстанавливать данные.
Правильная модель требует:
Типовой безопасный подход в CryptoJS:
const iv = CryptoJS.lib.WordArray.random(16);
const encrypted = CryptoJS.AES.encrypt(message, key, {
iv: iv
});
IV затем обычно передаётся вместе с результатом:
iv + ciphertext
Игнорирование уникальности IV фактически сводит безопасность AES-CBC к уровню простого детерминированного шифра, где:
В таких условиях стойкость определяется не алгоритмом AES, а лишь секретностью ключа, что недостаточно для защиты от большинства атак, основанных на анализе данных.