Метод встречи посередине

Материал из testwiki
Перейти к навигации Перейти к поиску

В криптоанализе методом встречи посередине или атакой «встречи посередине» (Шаблон:Lang-en) называется класс атак на криптографические алгоритмы, асимптотически уменьшающих время полного перебора за счет принципа «разделяй и властвуй», а также увеличения объема требуемой памяти. Впервые данный метод был предложен Уитфилдом Диффи и Мартином Хеллманом в 1977 году[1].

Начальные условия

Даны открытый (незашифрованный) и шифрованный тексты. Криптосистема состоит из h циклов шифрования. Цикловые ключи независимы и не имеют общих битов. Ключ K системы представляет собой сочетание из h-цикловых ключей k1,k2...kh. Задача состоит в нахождении ключа K.

Решение простого случая

Простым примером является двойное последовательное шифрование блочным алгоритмом двумя различными ключами K1 и K2. Процесс шифрования выглядит так:

s=ENCK2(ENCK1(p)),

где p — это открытый текст, s — шифротекст, а ENCKi() — операция однократного шифрования ключом Ki. Соответственно, обратная операция — расшифрование — выглядит так:

p=ENCK1−1(ENCK2−1(s))

На первый взгляд кажется, что применение двойного шифрования многократно увеличивает стойкость всей схемы, поскольку перебирать теперь нужно два ключа, а не один. В случае алгоритма DES стойкость увеличивается с 256 до 2112. Однако это не так. Атакующий может составить две таблицы:

  1. Все значения m1=ENCK1(p) для всех возможных значений K1,
  2. Все значения m2=ENCK2−1(s) для всех возможных значений K2.

Затем ему достаточно лишь найти совпадения в этих таблицах, то есть такие значения m1 и m2, что ENCK1(p)=ENCK2−1(s). Каждое совпадение соответствует набору ключей (K1,K2), который удовлетворяет условию.

Для данной атаки потребовалось 257 операций шифрования-расшифрования (лишь в два раза больше, чем для перебора одного ключа) и 257 памяти. Дополнительные оптимизации — использование хеш-таблиц, вычисления только для половины ключей (для DES полный перебор, на самом деле, требует лишь 255 операций) — могут снизить эти требования. Главный результат атаки состоит в том, что последовательное шифрование двумя ключами увеличивает время перебора лишь в два раза.

Решение в общем виде

Обозначим преобразование алгоритма как Ek(a)=b, где a -открытый текст, а b -шифротекст. Его можно представить как композицию Ek1Ek2...Ekh(a)=b, где Eki — цикловое преобразование на ключе ki. Каждый ключ ki представляет собой двоичный вектор длины n, а общий ключ системы — вектор длины n×h.

Заполнение памяти

Перебираются все значения k′=(k1,k2...kr), т.е первые r цикловых ключей. На каждом таком ключе k′ зашифровываем открытый текст a — Ek′(a)=Ek1Ek2...Ekr(a)=S (то есть проходим r циклов шифрования вместо h). Будем считать S неким адресом памяти и по этому адресу запишем значение k′. Необходимо перебрать все значения k′.

Определение ключа

Перебираются все возможные k″=(kr+1,kr+2...kh). На получаемых ключах расшифровывается шифротекст b — Ek″−1(b)=Ekh−1...Ekr+1−1(b)=S′ . Если по адресу S′ не пусто, то достаем оттуда ключ k′ и получаем кандидат в ключи (k′,k″)=k.

Однако нужно заметить, что первый же полученный кандидат k не обязательно является истинным ключом. Да, для данных a и b выполняется Ek(a)=b, но на других значениях открытого текста a′ шифротекста b′, полученного из a′ на истинном ключе, равенство может нарушаться. Все зависит от конкретных характеристик криптосистемы. Но иногда бывает достаточно получить такой «псевдоэквивалентный» ключ. В противном же случае после завершения процедур будет получено некое множество ключей k′,k″..., среди которых находится истинный ключ.

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

Атака с разбиением ключевой последовательности на 3 части

В некоторых случаях бывает сложно разделить биты последовательности ключей на части, относящиеся к разным ключам. В таком случае применяют алгоритм Шаблон:Нп5, предложенный Богдановым и Ричбергером в 2011 году на основе обычного метода встречи посередине. Данный алгоритм применим, когда нет возможности разделить последовательности ключевых битов на две независимые части. Состоит из двух фаз: выделения и проверки ключей[2].

Фаза выделения ключей

Вначале данной фазы шифр делится на 2 подшифра f и g, как и в общем случае атаки, однако допуская возможное использование некоторых битов одного подшифра в другом. Так, если b=Ek(a), то Ek(∗)=f(g(∗)); при этом биты ключа k, использующиеся в f обозначим kf, а в g — kg. Тогда ключевую последовательность можно разделить на 3 части:

  1. A0 — пересечение множеств kf и kg,
  2. A1 — ключевые биты, которые есть только в kf,
  3. A2 — ключевые биты, которые есть только в kg.

Далее проводится атака методом встречи посередине по следующему алгоритму:

  • Для каждого элемента из A0
  1. Вычислить промежуточное значение i=f(kf,a), где a — открытый текст, а kf — некоторые ключевые биты из A0 и A1, то есть i — результат промежуточного шифрования открытого текста на ключе kf.
  2. Вычислить промежуточное значение j=g−1(kg,b), где b — закрытый текст, а kg — некоторые ключевые биты из A0 и A2, то есть j — результат промежуточного расшифровывания закрытого текста на ключе kg.
  3. Сравнить i и j. В случае совпадения получаем кандидата в ключи.

Фаза проверки ключей

Для проверки ключей полученные кандидаты проверяют на нескольких парах известных открытых-закрытых текстов. Обычно для проверки требуется не очень большое количество таких пар текстов[2].

Пример

В качестве примера приведем атаку на семейство шифров KTANTAN[3], которая позволила сократить вычислительную сложность получения ключа с 280 (атака полным перебором) до 275,170[1].

Подготовка атаки

Каждый из 254 раундов шифрования с использованием KTANTAN использует 2 случайных бита ключа из 80-битного набора. Это делает сложность алгоритма зависимой только от количества раундов. Приступая к атаке, авторы заметили следующие особенности:

  • В раундах с 1 по 111 не были использованы следующие биты ключа: k32,k39,k44,k61,k66,k75.
  • В раундах со 131 по 254 не были использованы следующие биты ключа: k3,k20,k41,k47,k63,k74.

Это позволило разделить биты ключа на следующие группы:

  1. A0 — общие биты ключа: те 68 бит, не упомянутые выше.
  2. A1 — биты, используемые только в первом блоке раундов (с 1 по 111),
  3. A2 — биты, используемые только во втором блоке раундов (со 131 по 254).

Первая фаза: выделение ключей

Возникала проблема вычисления описанных выше значений i и j, так как в рассмотрении отсутствуют раунды со 112 по 130, однако тогда было проведено Шаблон:Нп5: авторы атаки заметили совпадение 8 бит в i и j, проверив их обычной атакой методом встречи посередине на 127 раунде. В связи с этим в данной фазе сравнивались значения именно этих 8 бит в подшифрах i и j. Это увеличило количество кандидатов в ключи, но не сложность вычислений.

Вторая фаза: проверка ключей

Для проверки кандидатов в ключи алгоритма KTANTAN32 потребовалось в среднем еще две пары открытого-закрытого текстов для выделения ключа.

Результаты

  • KTANTAN32: вычислительная сложность подбора ключа сократилась до 275,170 с использованием трех пар открытого-закрытого текста.
  • KTANTAN48: вычислительная сложность подбора ключа сократилась до 275,044 с использованием двух пар открытого-закрытого текста.
  • KTANTAN64: вычислительная сложность подбора ключа сократилась до 275,584 с использованием двух пар открытого-закрытого текста.

Тем не менее, это не лучшая атака на семейство шифров KTANTAN. В 2011 году была совершена атака[4], сокращающая вычислительную сложность алгоритма до 272,9 с использованием четырех пар открытого-закрытого текста.

Атака по полному двудольному графу

Атака по полному двудольному графу применяется для увеличения количества попыток атаки посредника с помощью построения полного двудольного графа. Предложена Диффи и Хеллманом в 1977 году.

Многомерный алгоритм

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

Предполагается, что атакуемый текст зашифрован некоторое количество раз блочным шифром:

C=ENCkn(ENCkn−1(...(ENCk1(P))...)) P=DECk1(DECk2(...(DECkn(C))...))

Алгоритм

  • Вычисляется:
sC1=ENCf1(kf1,P)  ∀kf1∈K
sC1 сохраняется вместе с k1 d H1.
sCn+1=DECbn+1(kbn+1,C)  ∀kbn+1∈K
sCn+1 сохраняется вместе с kbn+1 d Hbn+1.
  • Для каждого возможного промежуточного состояния s1 вычисляется:
sC1=DECb1(kb1,s1)  ∀kb1∈K
при каждом совпадении sC1 с элементом из H1 в T1 сохраняются kb1 и kf1.
sC2=ENCf2(kf2,s1)  ∀kf2∈K
sC2 сохраняется вместе с kf2 в H2.
  • Для каждого возможного промежуточного состояния s2 вычисляется:
sC2=DECb2(kb2,s2)  ∀kb2∈K
при каждом совпадении sC2 с элементом из H2 проверяется совпадение с T1, после чего в T2 сохраняются kb2 и kf2.
sC3=ENCf3(kf3,s2)  ∀kf3∈K
sC3 сохраняется вместе с kf3 в H3.
  • Для каждого возможного промежуточного состояния sn вычисляется:
sCn=DECbn(kbn,sn)  ∀kbn∈K и при каждом совпадении sCn с элементом из Hn проверяется совпадение с Tn−1, после чего в Tn сохраняются kbn и kfn.
sCn+1=ENCfn+1(kfn+1,sn)  ∀kfn+1∈K и при каждом совпадении sCn+1 с Hn+1, проверяется совпадение с Tn

Далее найденная последовательность кандидатов тестируется на иной паре открытого-закрытого текста для подтверждения истинности ключей. Следует заметить рекурсивность в алгоритме: подбор ключей для состояния sj происходит на основе результатов для состояния sj−1. Это вносит элемент экспоненциальной сложности в данный алгоритм[5].

Сложность

Шаблон:Mainref Временная сложность данной атаки составляет 2|kf1|+2|kbn+1|+2|s1|⋅(2|kb1|+2|kf2|+2|s2|⋅(2|kb2|+2|kf3|+...))

Говоря об использовании памяти, легко заметить что с увеличением i на каждый Ti накладывается все больше ограничений, что уменьшает количество записываемых в него кандидатов. Это означает, что T2,T3,...,Tn значительно меньше T1.

Верхняя граница объема используемой памяти:

2|kf1|+2|kbn+1|+2|k|−|s+n|+...
где k — общая длина ключа.

Сложность использования данных зависит от вероятности «прохождения» ложного ключа. Эта вероятность равна 1/2l, где l — длина первого промежуточного состояния, которая чаще всего равна размеру блока. Учитывая количество кандидатов в ключи после первой фазы, сложность равна 2|k|−|l|.

В итоге получаем 2|k|−2b, где |b| — размер блока.

Каждый раз, когда последовательность кандидатов в ключи тестируется на новой паре открытого-закрытого текста, количество успешно проходящих проверку ключей умножается на вероятность прохождения ключа, которая равна 1/2|b|.

Часть атаки полным перебором (проверка ключей но новых парах открытого-закрытого текстов) имеет временную сложность 2|k|−b+2|k|−2b+2|k|−3b+..., в которой, очевидно, последующие слагаемые все быстрее стремятся к нулю.

В итоге, сложность данных по аналогичным суждениям ограничена приблизительно ⌈|k|/n⌉ парами открытого-закрытого ключа.

Примечания

Шаблон:Примечания

Литература