Если IV для обоих зашифрованных уровней передаются в открытом виде, то существует общая атака восстановления ключа с известным открытым текстом, которая работает (по существу) в любом режиме шифрования и позволяет восстановить два ключа, используя примерно $3 \lceil k \mathbin/ b \rceil \cdot 2^k$ блокировать шифрование/дешифрование, $2k \cdot 2^k$ биты памяти и $O(к\cdot 2^k)$ среднее время незашифрованных вычислений, где $к$ и $b$ - размеры ключа и блока шифра в битах (т.е. $k = b = 128$ для AES-128 или $к = 256$, $б = 128$ для AES-256). Это просто выглядит так:
Расшифровать первый $\lceil k \mathbin/ b \rceil$ блоков зашифрованного текста с каждым из $2^к$ возможные внешние ключи и известный внешний IV. Для каждого ключа возьмите первый $к$ биты результирующего открытого текста (если $к$ уже не кратно $b$, что всегда для AES), добавьте ключ и сохраните комбинированный $2k$-битовая строка в списке.
Отсортируйте список. (Это занимает $O(n\logn)$ время для $n$-список элементов, где $n = 2^k$ в таком случае.)
Попытка зашифровать первый $\lceil k \mathbin/ b \rceil$ блоков известного открытого текста, используя каждый из $2^к$ возможные внутренние ключи и известный внутренний IV. Для каждого ключа найдите первый $к$ биты результирующего открытого текста в списке (используя бинарный поиск, который занимает $O(\log п)$ time), чтобы получить список возможных внешних ключей, которым может соответствовать этот внутренний ключ. (Среднее количество совпадений-кандидатов, которые вы найдете для каждого внутреннего ключа, равно одному, хотя, конечно, некоторые ключи не будут иметь совпадений, а некоторые будут иметь несколько.) Если совпадения есть, зашифруйте еще один блок известного открытого текста с помощью внутреннего ключа. ключ и расшифровать еще один блок зашифрованного текста с каждым совпадающим внешним ключом, чтобы увидеть, совпадают ли они по-прежнему. Если они это сделают (что вы ожидаете после тестирования в среднем половины внутренних ключей), у вас почти наверняка есть правильная пара ключей.
Обычная атака методом полного перебора ключей на не замужем многоуровневое шифрование, конечно, занимает около $\frac12 \lceil k \mathbin/ b \rceil \cdot 2^k$ заблокировать шифрование/дешифрование в среднем. Таким образом (по крайней мере, если мы игнорируем затраты памяти и учитываем только операции блочного шифрования) двойное шифрование с известными IV только (максимум) $6$ раз труднее взломать в среднем, чем одиночное шифрование, для (всего!) около $\log_2 6 ≈ 2,6$ дополнительные элементы безопасности. Который, просто чтобы быть ясным, абсолютно ничтожен.
(Правда, затраты памяти на эту атаку нет обязательно незначительным, но есть также различные компромиссы между временем и памятью, которые могут быть сделаны, чтобы уменьшить его.)
Обратите внимание, что общая атака «встреча посередине», описанная выше, зависит от того, что внутренний IV доступен злоумышленнику в открытом виде. Если это не так, но вместо этого он также зашифрован внешним ключом, то атака не будет работать без модификаций.
Конечно, тривиальным решением было бы просто перебрать все возможные значения 128-битного внутреннего IV на шаге 2. Для двойного AES-256 это позволит взломать двойное шифрование примерно за $2^{128} \times 2^{256} = 2^{384}$ шифрования AES, что все еще меньше, чем $2^{512}$ шифрования, которые можно было бы ожидать от длины ключа.