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

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

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

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

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

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

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

s=ENCK2(ENCK1(p)),

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

p=ENCK11(ENCK21(s))

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

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

Затем ему достаточно лишь найти совпадения в этих таблицах, то есть такие значения m1 и m2, что ENCK1(p)=ENCK21(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 — Ek1(b)=Ekh1...Ekr+11(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=g1(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(ENCkn1(...(ENCk1(P))...)) P=DECk1(DECk2(...(DECkn(C))...))

Алгоритм

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

Далее найденная последовательность кандидатов тестируется на иной паре открытого-закрытого текста для подтверждения истинности ключей. Следует заметить рекурсивность в алгоритме: подбор ключей для состояния sj происходит на основе результатов для состояния sj1. Это вносит элемент экспоненциальной сложности в данный алгоритм[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 парами открытого-закрытого ключа.

Примечания

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

Литература