Метод зустрічі посередині

Матеріал з 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), який задовольняє умови, оскільки

s=𝐸𝑁𝐶k2(𝐸𝑁𝐶k1(p))𝐸𝑁𝐶1k2(s)=𝐸𝑁𝐶1k2(𝐸𝑁𝐶k2[𝐸𝑁𝐶k1(p)])𝐸𝑁𝐶1k2(s)=𝐸𝑁𝐶k1(p)

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

Розв'язок у загальному вигляді

Позначимо перетворення алгоритму як Ek(a)=b, де a — Відкритий текст, а b — шифротекст. Його можна уявити як композицію Ek1Ek2...Ekh(a)=b, де Eki — циклове перетворення на ключі Eki. Кожен ключ ki являє собою двійковий вектор довжини n, а загальний ключ системи — вектор довжини n×h

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

2. Визначення ключа.

Перебираються всі можливі k=(kr+1,kr+2...kh). На отриманих ключах розшифровується шифротекст bEk1(b)=Ekh1...Ekr+11(b)=S. Якщо за адресою S не пусто, то дістаємо звідти ключ k і отримуємо кандидата в ключі (k,k)=k.

Однак, потрібно зауважити, що перший же отриманий кандидат k не обов'язково є справжнім ключем. Так, для даних a і b виконується Ek(a)=b, але на інших значеннях відкритого тексту a шифротексту b, отриманого з a на істинному ключі, рівність може порушуватися. Все залежить від конкретних характеристик криптосистеми. Але іноді буває достатньо отримати такий "псевдоеквівалентний" ключ. В іншому ж разі після завершення процедур буде отримана деяка множина ключів k,k..., серед яких знаходиться істинний ключ.

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

Атака з розбиттям ключової послідовності на 3 частини

У деяких випадках буває важко розділити біти послідовності ключів на частини, що належать до різних ключів. В такому разі застосовують алгоритм Шаблон:Iw, запропонований Богдановим і Річбергером в 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 - ключові біти, які є тільки в kf.

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

  • Для кожного елемента із A0
  1. Вирахувати проміжне значення i=f(kf,a), де a — відкритий текст, а kf — деякі ключові біти із A0 и A1, тобто, i — результат проміжного шифрування відкритого тексту на ключі kf.
  2. Вирахувати проміжне значення
  3. j=g1(kg,b), де b — закритий текст, а kg — деякі ключові біти із A0 и A2, тобто,. j — результат проміжного шифрування відкритого тексту на ключ   kg
  4. Порівняти 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, однак тоді було проведено Шаблон:Iw: автори атаки помітили збіг 8 біт в i і j, перевіривши їх звичайною атакою методом зустрічі посередині на 127 раунді. У зв'язку з цим у даній фазі порівнювалися значення саме цих 8 біт в підшифрах i і j. Це збільшило кількість кандидатів у ключі, але не складність обчислень.

Друга фаза: перевірка ключів

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

Результати

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

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

Багатовимірний алгоритм

Багатовимірний алгоритм методу зустрічі посередині застосовується при використанні великої кількості циклів шифрування різними ключами на блокових шифрах. Замість звичайної «зустріч посередині» в даному алгоритмі використовується поділ криптотексту кількома проміжними точками.[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.
  • Для кожного можливого проміжного стану s1 обчислюється:
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]

Складність

Часова складність даної атаки становить 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 парами відкритого-/закритого ключа.[5]

Примітки

Шаблон:Reflist

Література

  1. Шаблон:Cite journal