Сдвиговая атака

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску

Сдвиговая атака (англ. slide attack) – криптографическая атака, являющаяся, в общем случае, атакой на основе подобранного открытого текста, позволяющая проводить криптоанализ блоковых многораундовых шифров независимо от количества используемых раундов. Предложена Алексом Бирюковым и Дэвидом Вагнером в 1999 году[1].

История создания[править | править код]

Впервые идея создания сдвиговой атаки появилась у Эдны Гроссман и Брайана Такермана в 1977 году. Соответствующий отчет был опубликован[2] совместно с IBM. Гроссман и Такерман смогли показать возможность атаки на достаточно слабый шифр New Data Seal (NDS). Атака использует тот факт, что шифр в каждом раунде только перемешивает один и тот же ключ, используя одинаковую таблицу в каждом раунде. Использование открытых текстов позволяет обойти это и позволяет считать самой ранней версией атаки сдвига.

В 1990 году был предложен дифференциальный криптоанализ, продемонстрировавший уязвимость многораундовых DES-подобных криптосистем[3]. Одним из способов обеспечения их криптостойкости стало увеличение числа используемых раундов, которое повышало вычислительную сложность атаки пропорционально их количеству. Использование данного улучшения для многих алгоритмов шифрования основывалось, в частности, на эмпирическом суждении, что любые, даже довольно слабые шифры, можно сделать криптостойкими, многократно повторяя операции шифрования:

За исключением лишь некоторых вырожденных случаев, алгоритм можно сделать сколь угодно криптостойким путём увеличения числа раундов.

B. Preneel, V. Rijmen, A. Bosselears: Principles and Performance of Cryptographic Algorithms[4]

Так, например, некоторые шифры, предложенные в качестве кандидатов на конкурс AES в 1997 г., имели достаточно большое число раундов: RC6(20), MARS(32), SERPENT(32), CAST(48)[1].

Однако в 1999 г. была опубликована статья Алекса Бирюкова и Дэвида Вагнера с описанием сдвиговой атаки, которая опровергла данное предположение. Особенностью данной атаки являлось то, что она не зависела от количества раундов шифра; для её успешности требовались только идентичность раундов и возможность криптоанализа функции шифрования на отдельном раунде. В статье также было описано применение данной атаки к шифру TREYFER и упрощенным версиям шифров DES (2K-DES) и BLOWFISH[1].

В 2000 году была опубликована вторая статья, в которой были продемонстрированы улучшенные версии сдвиговой атаки – “Sliding with a twist” и “Complementation slide”, позволяющие распространить её на шифры, раунды которых имеют небольшие отличия. Так, с помощью данных улучшений были взломаны некоторые модификации шифра DES, а также упрощенная 20-раундовая версия стандарта шифрования ГОСТ 28147-89[5][6].

Общее описание[править | править код]

Атака на блочный шифр
Рис.1 Сдвиговая атака

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

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

Алгоритм простейшей атаки[править | править код]

Шаг 1. Возьмем некоторый открытый текст на входе и соответствующий ему шифротекст на выходе алгоритма шифрования.
Шаг 2. Возьмем некоторый другой открытый текст и соответствующий ему шифротекст такие, что пара отлична от уже выбранной пары .
Шаг 3. Предположим, что связан с соотношением = , и связан с соотношением , т.е. и являются результатами однораундового шифрования и соответственно. Назовем такую пару «сдвиговой парой» (slid pair)[1]. Используя утверждение о том, что ключ шифрования можно легко вычислить, зная текст на входе и текст на выходе некоторого раунда, вычислим ключ на первом раунде шифрования по соотношению , и ключ на последнем раунде шифрования по соотношению .
Шаг 4. Проверим равенство . Т.к. по условию все раундовые ключи одинаковы, то данное равенство должно выполняться, иначе предположение, сделанное на шаге 3 неверно, и необходимо вернуться к шагу 2, исключив проверенную пару из списка возможных кандидатов. Выполнение равенства свидетельствует о том, что ключ потенциально является искомым раундовым ключом.
Шаг 5. Для проверки найденного ключа на ложноположительность следует его подставить в алгоритм шифрования и проверить правильность работы на нескольких различных заведомо известных парах «открытый текст – шифротекст». Несмотря на то, что прохождение неверным ключом данной проверки возможно, в случае хороших шифров вероятность этого крайне мала[7], а значит проверенный ключ с высокой долей вероятности является искомым раундовым ключом. Таким образом, в случае успешной проверки объявляем ключ искомым, иначе возвращаемся к шагу 2, исключив проверенную пару и ключ из списка возможных кандидатов.

Примечания к алгоритму[править | править код]

  • Согласно парадоксу дней рождения, две пары и такие, что , найдутся с высокой долей вероятности уже среди пар «открытый текст – шифротекст», где – длина блока шифрования в битах[6]. Из этого следует, что перед проведением атаки можно заранее сгенерировать набор из различных открытых текстов и впоследствии проверять кандидатов только из этого набора[7].
  • Требование 2, в общем случае, может быть ослаблено. Так, единственным требованием к функции шифрования будет являться уязвимость функции для атак на основе открытых текстов при наличии хотя бы двух заранее известных различных пар «открытый текст – шифротекст»[1]. Из этого следует, что для того, чтобы найти потенциальный искомый раундовый ключ, необходимо сначала найти сдвиговую пару . Конкретные алгоритмы поиска сдвиговой пары применительно к разным шифрам, вообще говоря, различны, но в то же время они используют одинаковый принцип. Прежде чем искать сдвиговую пару, генерируется набор из различных открытых текстов, о чем было упомянуто в предыдущем примечании, а затем произвольно выбирается пара , и подбираются ключи, одновременно удовлетворяющие соотношениям и , если такие ключи вообще существуют. Если найден хотя бы один такой ключ, то выбранная пара объявляется сдвиговой, и после этого необходимо только проверить подобранные ключи на ложноположительность.
  • К простейшему случаю легко сводится вариант, когда ключевое расписание (англ. key schedule) шифра предполагает циклическое повторение некоторого набора ключей. Для этого данный набор можно объявить раундовым ключом и считать последовательность этапов шифрования, использующих этот набор, отдельным раундом. Такие шифры называются шифрами с p-раундовым самоподобием (англ. p-round self-similarity ciphers)[5]. Однако при таком объединении раундов сдвиговая атака может стать неэффективной – так, например, в случае объединения раундов размер раундового ключа увеличится соответственно в раз, что может значительно усложнить криптоанализ функции шифрования на отдельном раунде.

Модификации сдвиговой атаки[править | править код]

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

Формулировка проблемы[править | править код]

Пусть имеется алгоритм шифрования №1, состоящий из блоков, такой, что на -м раунде используется ключ (будем считать, что всего ключей , ключ потребуется позже), и пусть мы выбрали некоторую пару «открытый текст – шифротекст» . На выходе первого раунда получим текст , где – функция шифрования.

Далее сдвиговая атака предполагает шифрование текста новым блоковым шифром №2, состоящим из блоков со по . Обозначим шифротекст на выходе -го блока как . Нетрудно заметить, что в таком случае на выходе -го блока мы получим уже найденный выше текст , а значит текст и шифротекст связаны соотношением .

Таким образом, мы получили пару , удовлетворяющую соотношениям и , которая является ничем иным, как сдвиговой парой общего вида. Соответственно, в простейшем случае данные соотношения примут вид и .

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

Случай сети Фейстеля с двухраундовым самоподобием[править | править код]

Сдвиг с дополнением (англ. Complementation slide)[5][править | править код]

Рис.2 Сдвиг с дополнением (complementation slide)

Как было упомянуто в примечаниях к алгоритму атаки, случай криптоанализа шифров с p-раундовым самоподобием можно легко свести к простейшему случаю сдвиговой атаки путём объединения нескольких раундов в один, что эквивалентно сдвигу блоков шифрования на раундов. В случае сети Фейстеля с попеременно чередующимися раундовыми ключами и , т.е. с двухраундовым самоподобием, такой подход может повысить сложность криптоанализа, а значит, сделать сдвиговую атаку неэффективной. Вместо этого было предложено, как и прежде, производить сдвиг всего на один раунд вместо двух, но при этом несколько изменить требования, накладываемые на сдвиговую пару.

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

Несмотря на то, что дальнейшие рассуждения будут демонстрироваться на примере 4-раундового шифра, они могут быть расширены на любое количество раундов. Для начала рассмотрим, как изменяется открытый текст на различных раундах шифрования. Представим открытый текст в виде , где и – левая и правая части текста соответственно.

Номер раунда Левая часть Правая часть
1
2
3
4

Обозначим текст на выходе 1 раунда , а шифротекст . Теперь заметим, что для того, чтобы найти шифротекст на выходе 4-раундового блокового шифра с ключевым расписанием , достаточно лишь на каждом раунде исходного шифра внести в правую часть разницу , а затем зашифровать текст полученным шифром (рис.2, правая схема). Для этого на вход исходного шифра подадим текст . Шифротекст обозначим как . Рассмотрим, как изменяется текст на различных раундах шифрования.

Номер раунда Левая часть Правая часть
1
2
3

4

Отсюда видно, что введенная разница сохраняется на каждом раунде, а значит шифротексты и связаны соотношениями: и , а пары «открытый текст – шифротекст» и соотношениями и .

В случае, если тексты связаны соотношением , говорят, что тексты и имеют сдвиговую разницу (англ. slid difference) .

Таким образом, для сдвиговой пары получены следующие уравнения:


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

Сдвиг с поворотом (англ. Sliding with a twist)[5][править | править код]

Рис.3 Сдвиг с поворотом (Sliding with a twist)

Указанное в формулировке проблемы требование возможности работать с исходным шифром №1, состоящим из блоков с по , и новым шифром №2, состоящим из блоков со по , может быть легко преобразовано с помощью так называемого подхода сдвига с поворотом.

Если исключить последнюю перестановку левой и правой частей текста и изменить порядок следования ключей на противоположный, то расшифровка в сети Фейстеля будет происходить точно так же, как и шифрование[1]. Подход сдвига с поворотом состоит в использовании этого свойства, а именно, он предлагает использовать в качестве шифра №2 алгоритм расшифровки (см. рис.3).

Принципиальных отличий от простейшего алгоритма данный подход не имеет. Как и в простейшем случае, требования, предъявляемые к сдвиговой паре , где . Таким образом, получаем уравнения:


и условие, позволяющее проще находить сдвиговые пары:

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

Количество требуемых текстов на данном шаге можно сократить до . Для этого зашифруем различных текстов вида , и расшифруем различных текстов вида , где и фиксированы и удовлетворяют условию . Таким образом, поскольку теперь мы, фактически, работаем с – битными текстами, согласно парадоксу дней рождения среди этих пар «открытый текст – шифротекст» с большой долей вероятности найдется сдвиговая пара.

Ключ можно найти, применив способ, описанный для общего случая блоковых шифров с p-раундовым самоподобием, а именно, объединив каждые последующие два раунда в один - таким образом мы сводим задачу к простейшем случаю. Несмотря на то, что размер раундового ключа увеличится вдвое, это не приведет к усложнению криптоанализа, поскольку ключ , являющийся половиной нового раундового ключа, уже известен, и нам необходимо найти лишь вторую половину, равную по размеру раундовому ключу в исходной задаче.

Другие модификации[править | править код]

Отдельной модификацией можно считать одновременное использование двух описанных выше подходов – Complementation slide и Sliding with a twist, позволяющее распространить сдвиговую атаку на шифры с 4-раундовым самоподобием[5].

От всех рассмотренных до этого случаев отличается задача криптоанализа шифров с неодинаковыми раундами, при решении которой ни одна из рассмотренных модификаций атаки не может быть использована. Для случая подобных шифров была предложена сдвиговая атака с преобразованием (англ. realigning slide attack)[8], продемонстророванная на примере модификаций шифра DES, в частности, на примере полного 16-раундового варианта DES

Сдвигово – линейная атака (англ. slide-linear attack)[9] является примером реализации сдвиговой атаки с применением принципов линейного криптоанализа. Работа данной атаки была показана на шифре 4K-DES.

Также существуют улучшения, позволяющие ускорить реализацию уже существующих модификаций сдвиговой атаки. В частности, одно из таких улучшений, описанное в работе Eli Biham, Orr Dunkelman, Nathan Keller: Improved Slide Attacks[10], позволяет значительно быстрее находить сдвиговые пары, используя при этом циклическую структуру шифров и соответствующие ей перестановки ключей. Работа данной модификация была показана на примере различных вариантов шифра ГОСТ 28147-89 (GOST).

Алгоритмы шифрования, уязвимые для сдвиговой атаки и её модификаций[править | править код]

Описанные в оригинальных статьях:[1][5][править | править код]

Описанные в других источниках[править | править код]

Сдвиговые атаки класса хеш-функций[13][править | править код]

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

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

Хеш-функции, уязвимые для сдвиговой атаки:[13][править | править код]

Способы повышения криптостойкости к модификациям сдвиговых атак [7][16][править | править код]

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

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

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

Примечания[править | править код]

  1. 1 2 3 4 5 6 7 Alex Biryukov, David Wagner. Slide Attacks (англ.) // Fast Software Encryption. 6th International Workshop, FSE’99 Rome, Italy, March 24–26, 1999 Proceedings. — Springer Berlin Heidelberg, 1999. — P. 245-259. — ISBN 978-3-540-66226-6. (недоступная ссылка)
  2. E. K. Grossman, Thomas J. Watson IBM Research Center Research Division, B. Tuckerman. Analysis of a Feistel-like Cipher Weakened by Having No Rotating Key. — IBM Thomas J. Watson Research Division, 1977. — 33 с.
  3. Eli Biham, Adi Shamir. Differential Cryptanalysis of DES-like Cryptosystems (англ.) // Advances in Cryptology-CRYPT0’ 90 Proceedings. — Springer Berlin Heidelberg, 1990. — P. 2-21. — ISBN 978-3-540-54508-8. (недоступная ссылка)
  4. B. Preneel, V. Rijmen, A. Bosselears. Principles and Performance of Cryptographic Algorithms (англ.) // Dr. Dobb's Journal. — Miller Freeman, 1998. — Vol. 23, no. 12. — P. 126-131.
  5. 1 2 3 4 5 6 Alex Biryukov, David Wagner. Advanced Slide Attacks (англ.) // Advances in Cryptology — EUROCRYPT 2000. International Conference on the Theory and Application of Cryptographic Techniques Bruges, Belgium, May 14–18, 2000 Proceedings. — Springer Berlin Heidelberg, 2000. — P. 589-606. — ISBN 978-3-540-67517-4. (недоступная ссылка)
  6. 1 2 Панасенко С. П. Сдвиговая атака // Алгоритмы шифрования. Специальный справочникСПб.: BHV-СПб, 2009. — С. 40—42. — 576 с. — ISBN 978-5-9775-0319-8
  7. 1 2 3 4 5 Chalermpong Worawannotai, Isabelle Stanton. A Tutorial on Slide Attacks (англ.). Архивировано 29 ноября 2014 года.
  8. Raphael C. -W. Phan. Advanced Slide Attacks Revisited: Realigning Slide on DES (англ.) // Progress in Cryptology – Mycrypt 2005. First International Conference on Cryptology in Malaysia, Kuala Lumpur, Malaysia, September 28-30, 2005. Proceedings. — Springer Berlin Heidelberg, 2005. — P. 263-276. — ISBN 978-3-540-28938-8. Архивировано 12 июня 2018 года.
  9. 1 2 Soichi Furuya. Slide Attacks with a Known-Plaintext Cryptanalysis (англ.) // Information Security and Cryptology — ICISC 2001. 4th International Conference Seoul, Korea, December 6–7,2001 Proceedings. — Springer Berlin Heidelberg, 2002. — P. 214-225. — ISBN 978-3-540-43319-4. Архивировано 9 июня 2018 года.
  10. Eli Biham, Orr Dunkelman, Nathan Keller. Improved Slide Attacks (англ.) // Fast Software Encryption. 14th International Workshop, FSE 2007, Luxembourg, Luxembourg, March 26-28, 2007, Revised Selected Papers. — Springer Berlin Heidelberg, 2007. — P. 153-166. — ISBN 978-3-540-74617-1. (недоступная ссылка)
  11. Selçuk Kavut, Melek D. Yücel. Slide Attack on Spectr-H64 (англ.) // Progress in Cryptology — INDOCRYPT 2002. Third International Conference on Cryptology in India Hyderabad, India, December 16–18, 2002 Proceedings. — Springer Berlin Heidelberg, 2002. — P. 34-47. — ISBN 978-3-540-00263-5. Архивировано 11 июня 2018 года.
  12. Nicolas T. Courtois, Gregory V. Bard, David Wagner. Algebraic and Slide Attacks on KeeLoq (англ.) // Fast Software Encryption. 15th International Workshop, FSE 2008, Lausanne, Switzerland, February 10-13, 2008, Revised Selected Papers. — Springer Berlin Heidelberg, 2008. — P. 97-115. — ISBN 978-3-540-71038-7. Архивировано 30 октября 2018 года.
  13. 1 2 Michael Gorski, Stefan Lucks, Thomas Peyrin. Slide Attacks on a Class of Hash Functions (англ.) // Advances in Cryptology - ASIACRYPT 2008. 14th International Conference on the Theory and Application of Cryptology and Information Security, Melbourne, Australia, December 7-11, 2008. Proceedings. — Springer Berlin Heidelberg, 2008. — P. 143-160. — ISBN 978-3-540-89254-0. (недоступная ссылка)
  14. Yu Sasaki, Lei Wang, Kazuo Ohta, Noboru Kunihiro. Password Recovery on Challenge and Response: Impossible Differential Attack on Hash Function (англ.) // Progress in Cryptology – AFRICACRYPT 2008. First International Conference on Cryptology in Africa, Casablanca, Morocco, June 11-14, 2008. Proceedings. — Springer Berlin Heidelberg, 2008. — P. 290-307. — ISBN 978-3-540-68159-5. Архивировано 6 июня 2018 года.
  15. 1 2 Markku-Juhani O. Saarinen. Cryptanalysis of Block Ciphers Based on SHA-1 and MD5 (англ.) // Fast Software Encryption. 10th International Workshop, FSE 2003, Lund, Sweden, February 24-26, 2003. Revised Papers. — Springer Berlin Heidelberg, 2003. — P. 36-44. — ISBN 978-3-540-20449-7. (недоступная ссылка)
  16. Francois-Xavier Standaert, Gilles Piret, Jean-Jacques Quisquater. Cryptanalysis of Block Ciphers: A Survey (англ.) // UCL Crypto Group Technical Report Series. — 2003. Архивировано 10 февраля 2014 года.