Разное
 

Криптоанализ алгоритма Rijndael.

Niels Ferguson, John Kelsey, Stefan Lucks, Bruce Schneier, Mike Stay, David Wagner, and Doug Whiting.

Перевод Алексея Гончарова.

Москва, 2000

Криптоанализ алгоритма Rijndael.

  1. Введение.

Rijndael - один из пяти шифров, прошедших во второй раунд конкурса на получение статуса AES. В своей структуре он имеет 10, 12, или 14 тактов криптопреобразования в зависимости от длины ключа. Ранее был известен метод, позволяющий взломать до 6-ти тактов алгоритма. В этой работе описывается атака на 7-ой такт Rijndael.

В разделе 2 описывается техника "частичных сумм", которая позволяет очень сильно снизить сложность осуществления шеститактовой атаки. Также показывается, как применить эту идею для атак на 7-ой и 8-ой такты криптопреобразования, используя дополнительные открытые тексты (если это возможно), чтобы снизить сложность атаки. Атаки на семитактовый Rijndael со 128-битным ключом и на восьмитактовый со 192-битным и 256-битным ключом требуют почти полный набор шифров (2128-2119 известных открытых текстов); поэтому они не имеют практического применения вследствие недоступности необходимых вычислительных мощностей. Все эти атаки используют расширение специализированной Square - атаки, названной по имени алгоритма Square (предтечи Rijndael), для которого она разрабатывалась.

В разделе 3 рассматривается задача генерации ключей (ключеформирования); показываются отдельные необычные свойства ключеформирования, которые можно рассматривать как нарушение общепризнанных критериев построения шифра. Несмотря на то, что пока не известно каких - либо атак, которые основывались бы на этих свойствах, наличие этих качеств настораживает.

В заключение, в разделе 4 используется слабая диффузия ключеформирования в Rijndael для разработки зависящей о ключа атаки, которая может быть применена к девятитактовому Rijndael с 256-битным ключом.

Итоги этих атак, включающие величины временной и информационной сложностей, приведены в таблице 1. Так же рекомендуется просмотреть приложение А для ознакомления с обозначениями, используемыми в описании этапов криптопреобразования.

Шифр

Длина ключа

Сложность

Комментарии

Данные

Время

Rijndael-6

любая

232 CP

272

известная ранее атака

Rijndael-6

любая

6*232 CP

244

частичные суммы

Rijndael-7

192

19*232 CP

2155

частичные суммы

Rijndael-7

256

21*232 CP

2172

частичные суммы

Rijndael-7

любая

2128-2119 CP

2120

частичные суммы

Rijndael-8

192

2128-2119 CP

2188

частичные суммы

Rijndael-8

256

2128-2119 CP

2204

частичные суммы

Rijndael-9

256

285 RK-CP

2224

атака, зависящая от ключа

CP - открытые тексты (Chosen Plaintext),

RK-CP - открытые тексты, зависящие от ключа.

Таблица 1. Результаты атак на Rijndael.

  1. Square-атака.

    1. Известная 6-тактовая атака.

Техника, рассматриваемая далее, впервые была задействована при разработке атаки на блочный шифр Square; она применима ко всем блочным шифрам с любой длиной ключа.

Обозначим через m(r), b(r) и t(r) значения текста, используемые в такте r после операций перемешивания столбцов (MixColumn), добавления ключа (key addition) и сдвига строк (ShiftRow) соответственно. Обозначим через k(r) тактовый ключ цикла r, через k(r)' - эквивалентное значение тактового ключа, которое может быть XORено с данными перед операцией перемешивания столбцов, а не после. При необходимости посмотрите в приложении А более подробное объяснение используемых обозначений.

Атака начинается с получения 256-ти криптограмм, различающихся только в одном байте m(1), которые охватывают все возможные значения данного байта. Один байт m(1) зависит от 4-х байтов открытого текста и от 4-х байтов ключа k(0). Для этого выберем 232 открытых текстов, с фиксированной общей частью и варьирующейся частью размером в 4 байта, охватывающей все возможные 232 значений. Затем задаемся произвольными значениями 4-х байтов ключа. Для каждого возможного значения байтов ключа можно найти 224 групп по 256 открытых текстов, которые, будучи подвергнуты операции перемешивания столбцов, внутри своей группы будут отличаться только одним байтом из m(1); так как открытые тексты были различны, то этот байт из m(1) примет все 256 возможных значений.

Отслеживая изменения внутри шифра, заметим, что каждый из байтов t(4) примет все возможные значения. Если мы просуммируем значения каждого из этих байтов по всем 256 криптограммам, то получим ноль. Это свойство характерно для линейной функции, поэтому каждый из байтов из m(4) и из b(4) также дадут ноль при суммировании их значений во всех 256-ти криптограммах.

Теперь посмотрим, как байт из b(4) связан с байтами из криптограммы. Для анализа мы незначительно изменили структуру шифра и поместим добавление ключа перед преремешиванием столбцов в такте 5. Вместо перемешивания столбцов и добавления ключа k(5) мы вначале добавим ключ k(5)', а потом применим перемешивание столбцов. При такой конфигурации легче разглядеть, что любой байт из b(4) зависят от шифртекста, 4-х байтов ключа k(6) и одного байта псевдоключа k(5)'. Мы предположим значения этих 5-ти байт ключа, вычислим значение байта из b(4) для всех 256 криптограмм и найдем ту, для которой сумма соответствующих байт равна нулю.

Для каждой группы из 256 криптограмм такая фильтрация забракует 256 из 256-ти для всех неверных предположений о значении ключа. Если бы проверялись значения для всех 9-ти байтов ключа, то потребовалось бы 10 или более групп из 256 криптограмм, чтобы найти весь ключ.

В качестве обобщения заметим, что эта атака требует 232 выбранных открытых текстов, 232 ячеек памяти для хранения пар текст/шифрограмма, и 272 шагов для выяснения 9-ти байтов ключа. Каждый шаг включает в себя частичную дешифрацию 256 криптограмм, но правильное упорядочивание вычислений может сделать это очень быстрым. Это сравнимо по времени с одиночным шифрованием. Общая вычислительная сложность этой атаки порядка 272 шифрований.

    1. Расширение до 7-ми тактов.

Предыдущая атака может быть распространена на 7-тактовый шифр со 192-битным и 256-битным ключом. Достаточно угадать 16 байт последнего тактового ключа. Если действовать прямо, то это добавляет 128 бит к угадыванию ключа, а временные затраты возрастают до 2200; требования к открытым текстам и памяти не изменяются, несмотря на то, что необходимо использовать больше групп для проверки потенциальных ключей.

Эта процедура может быть усовершенствована. Ключеформирование обеспечивает зависимость между байтами расширенного ключа, и это можно использовать для атаки. Для 192-битного ключа угадывание последнего тактового ключа k(7) дает 2 из 4-х байтов k(6)', который должен быть отгадан, плюс байт из k(5)', который также нужно отгадать. Это уменьшает размер угадываемого ключа на 24 бита, что дает общую сложность порядка 2176. Для 256-битного ключа байты при ключеформировании выровнены другим образом. Угадывание всего k(7) не дает никакой информации о k(6)', но дает один байт из k(5)'. Для этой длины ключа сложность атаки равна 2192.

    1. Усовершенствование.

Атака на 6-тактовый Rijndael, описанная в разделе 2.1, может быть улучшена. Вместо угадывания 4-х байтов k(0) мы просто задействуем все 232 открытых текста. Для любого значения первого тактового ключа эти криптограммы содержат 224 групп по 28 криптограмм, различающихся только в одном байте m(1). Все, что будет делаться далее, аналогично предыдущей атаке: угадываем 5 байт ключа в конце шифра, частично дешифруем один байт b(4), суммируем его значение со всеми остальными в криптограммах и проверяем на нулевой результат. По сравнению с первоначальной версией, мы узнаем только 40 бит ключа вместо 72. Но с другой стороны, мы должны затратить только 224 операций для каждого угадывания. Это усовершенствование уменьшает затраты на 28, но требует около 6*232 открытых текстов для обеспечения достаточного числа наборов, необходимых для однозначной идентификации истинного значения 5-ти байт ключа.

Рассмотрим эту атаку более детально. Получив 232 криптограмм, мы угадываем 5 байт ключа, частично дешифруем один байт b(4) из всех криптограмм и суммируем эти байты по всем криптограммам. Рассмотрим эту частичную дешифрацию. В любом шифртексте мы используем только 4 байта. Каждый из них XORится c байтом ключа, затем к каждому байту применяется обратный S-box, и в завершении умножается на заданную часть инверсной MSD-матрицы. Четыре байта XORятся вместе, 5-ый байт ключа XORится с результатом применения обратного S-box`а, и полученные значения суммируются по всем шифртекстам.

Обозначим через ci,j j-ый байт i-ой криптограммы. Для простоты поставим в соответствие байтам, используемым нами в каждом блоке шифртекста, номера от 0 до 3. Пусть k0,…,k4 соответствуют 5-ти байтам ключа, которые пытаемся отгадать. Мы хотим вычислить

(1),

где S0,…,S3 - биективные S-box`ы, каждый из которых содержит инверсный Rijndael-S-box и следующее за ним умножение на инверсную MDS-матрицу. Имея 232 криптограмм и 240 возможных значений ключа, мы получим для суммирования 272 различных значений, которое в грубой оценке требует затрат порядка 264 стандартных операций шифрования.

Мы можем организовать эту работу более производительно следующим образом: для каждого k мы поставим в соответствие каждой криптограмме c "частичную сумму" xk, определяемую следующим образом:

.

Это даст нам отображение 0, с1, с2, с3) (xk, ck+1,…,c3), которое можно применить к каждому из шифртекстов, если мы знаем k0,…,kk.

Мы начинаем со списка из 232 криптограмм, угадываем k0 и k1 и вычисляем, как часто каждая триада (x1, c2, c3) попадает в список. C этой целью для каждого i вычислим 3-байтовое значение как функцию от шифртекста и угадываемого ключа, и подсчитаем, сколько раз каждое 3-байтовое значение появляется в процессе этих вычислений. Возможно появление 224 различных 3-байтовых значений, но нам не нужно хранить список всех значений; нам нужно только число появлений каждой триады. Мы угадаем k2 и вычислим, как часто встречается пара (x2, c3); угадаем k3 и вычислим, как часто встречается значение x3. Наконец, мы угадаем k4 и вычислим долгожданную сумму.

Так как все суммы берутся с использованием XOR, и так как для любых z, то этого достаточно только для подсчетов по модулю 2. Таким образом, для каждого счетчика достаточно одного бита, и для всех 224 счетчиков требуется 224 бит.

Как много времени на это затратится? На первом этапе мы угадываем 16 бит и обрабатываем 232 криптограмм, что в сумме дает 248 операций. На следующем этапе мы угадываем еще 24 бита, но при этом обрабатываем только 224 триад, что в сумме дает 248 операций. В итоге, мы получаем 248 вычислений выражения (1), или порядка 250 вычислений S-box.

Это итоговая работа, неоходимая при единичной структуре из 232 криптограмм. Первая структура уже очищена от подавляющего большинства неверных ключей, но мы все еще должны пройти первые шаги вычисления частичных сумм для каждой из шести структур, которые нами используются. Таким образом, общее число S-box`ов возрастает до 252.

Используя приближенное равенство 28 S-box'ов одному стандартному криптопреобразованию, получим, что 252 S-box'ов сравнимы с 244 операций. Это значительное достижение по сравнению с предыдущим объемом работ 272.

    1. Расширение до 7-ми тактов.

Мы можем применить усовершенствование к 7-тактовой атаке из раздела 2.2. Для выражения байта из b(4) через ключ и шифртекст мы возьмем формулу, подобную (1), но трехуровневую, 16 байт криптограммы и 21 байт ключа. Техника "частичных сумм" поможет только во время последней части вычислений, потому что она сэкономит время, если мы имеем больше криптограмм, чем возможных значений промежуточного результата. При наличии в структуре 232 пар текст/шифрограмма эта техника не поможет нигде за исключением последнего шага вычислений.

Для схемы со 192-битным ключом мы может сначала угадать 128 бит последнего тактового ключа. Эти биты будут также определять 2 из 4-х байт 6-го такта, и один байт ключа 5-го такта. Таким образом, после угадывания последнего тактового ключа мы можем уменьшить каждую структуру до 224 счетчиков с помощью техники "частичных сумм". Используя некоторые предварительно вычисленные таблицы, мы можем сделать это для каждой из 2128 догадок примерно за 232 обращений к памяти. Следующая стадия приносит еще один байт и требует 224 шагов для уменьшения частичных сумм до 216 счетчиков, и последний этап дает последний оставшийся байт и получает конечный результат. Каждая из этих фаз занимает около 2160 шагов. Мы имеем три этапа, каждый из которых требует 2160 шагов, и нам нужно обработать три структуры, прежде чем начать выделение догадок для последнего тактового ключа, поэтому общие затраты на эту атаку составляют порядка 2163 S-box'ов или около 2155 обычных криптопреобразований.

Для 256-битного ключа выравнивание в процессе ключеформирования различное. Получение последнего тактового ключа не дает нам никакой информации о ключе 6-го раунда, но говорит немного больше о ключе 5-го такта. Работая с простой структурой как раньше, мы получим 128 бит последнего тактового ключа и вычислим 4 байта ключа 6-го такта для каждого из 232 текстов за общее время порядка 2160. На следующем этапе мы получим еще 16 бит ключа и результаты в 224 однобитовых счетчиках за общее время порядка 2176. Дальнейшие фазы расчитываются аналогичным способом. Затраты времени на структуру составляют приблизительно 2178 S-box'ов или 2170 криптопреобразований. Необходимо пять структур, прежде чем начать отбрасывание догадок о последнем тактовом ключе, поэтому общая сложность этой атаки составляет примерно 2172.

    1. Второе усовершенствование.

Возможно дальнейшее преобразование технологии атаки при условии, что считается целесообразным уменьшить временную сложность за счет увеличения информационных затрат.

Вначале будет показано, что 7-тактовый Rijndael может быть сломан при наличии 2128 известных текстов при временных затратах порядка 2120 обычных шифрований. Эти шифрования разделяются на 296 пакетов по 232 шифрований в каждом, различающиеся только в четырех байтах m(1). Эти 4 байта находятся на местах, необходимых для применения атаки из раздела 2.3: конкретно каждый пакет из 232 шифрований содержит 224 групп по 28 шифрований, которые различаются только одним байтом m(2). Соответственно, мы можем рассматривать содержимое набора из 2128 шифрований как 2120 групп по 28 шифрований, которые отличаются только в одном байте m(2). Это обеспечивает, что суммирование одного байта из b(5) по всем 28 криптограммам в группе даст ноль, и суммирование по всем 2128 криптограммам также даст ноль. На этом простом свойстве и базируется атака, описываемая ниже.

Самый простой путь использования этого свойства- это угадать 5 байт ключа в конце шифра, частично расшифровать один байт b(5) каждого блока шифртекста, просуммировать по всем 2128 криптограммам и проверить на ноль. Однако этот простой путь непригоден. Любой неправильный ключ даст ноль после суммирования байта из b(5) по всем 2128 криптограммам, потому что для любого биективого 128-битного блочного шифра b(5) (или любая другая промежуточная величина) принимает все возможные 128-битовые значения в течение своего цикла из 2128 криптопреобразований. Следовательно, необходимо слегка модифицировать атаку.