140 likes | 291 Views
Универзитет у Београду Математички факултет АНАЛИЗА АЛГОРИТМА ЗА ШИФРОВАЊЕ У ПРОГРАМУ PKZIP. - мастер рад - аутор: ментор : Зоран Ташић проф. др Миодраг Живковић. ПРОГРАМ PKZIP. архивирање фајлова компримовање фајлова шифровање фајлова
E N D
Универзитет у БеоградуМатематички факултетАНАЛИЗА АЛГОРИТМА ЗА ШИФРОВАЊЕ У ПРОГРАМУ PKZIP - мастер рад - аутор: ментор: Зоран Ташић проф. др Миодраг Живковић
ПРОГРАМ PKZIP • архивирање фајлова • компримовање фајлова • шифровање фајлова • 1989. прва верзија • Фил Кац (Phil Katz) – Phil Katz’s ZIP program • .zip формат • E.Biham, P.Kocher, A known plaintext attack on the PKZIP stream cipher, Fast Software Encryption 1994. Lecture Notes in Computer vol. 1008, Springer, 1994.
ШИФРОВАЊЕ У ПРОГРАМУ PKZIP • Алгоритам развијен специјално за примену у програму Pkzip • Базиран на интерном кључу од 96-бита • Напад на интерни кључ методом грубе силе – сложеност 296 • У овом раду показује се да је могуће извршити напад сложености 238
МОДИФИКАЦИЈА ИНТЕРНОГ КЉУЧА update_keys(char): KEY0 KEY1 KEY2 i + 134775813 char CRC32 CRC32 * mod32 + 1 i+1 LSB MSB 3 or 1 ??????11 xor temp CRC32(pval,char) = (pval » 8) xor crctab[LSB(pval) xor char] ??????11 KEY3 temp *
Први корак шифровања Иницијализација интерног кључа и његова модификација под утицајем унете лозинке: key0=0x12345678; key1=0x23456789; key2=0x34567890; for i=1 to strlen(password) update_keys(password[i]); Други корак шифровања Додавање заглавља шифровања (11 случајно добијених бајтова и 12. бајт који се чита из заглавља фајла )и његово шифровање for i = 1 to 12 Ci = Pi xor key3i; update_keys (Pi); Трећи корак шифровања: Учитавање једног по једног знака из улазног фајла, шифровање тих знакова и модификација интерног кључа for i = 1 to sizeof(nesifr_file) учитај Pi; Ci = Pi xor key3i; update_keys(Pi); МЕХАНИЗАМ ШИФРОВАЊА
ОДРЕЂИВАЊЕ ИНТЕРНОГ КЉУЧА • Одређивање листе вредности key3 • Одређивање листе вредности key2 • Редуковање броја могућих вредности key2 (опционо) • Одређивање листе вредности key1 • Одређивање листе вредности key0 • Одређивање интерног кључа • Одређивање лозинке (опционо)
ОДРЕЂИВАЊЕ ЛИСТЕ ВРЕДНОСТИ KEY3 Ci = Pi xor key3i; key3i = Pi xor Ci; отворени текст (Pi) шифрат(Ci) • key3i i i i 1 xor 1 1 2 xor 2 2 3 xor 3 3 4 xor 4 4 ... ... ... 11 xor 11 11 12 xor 12 12 13 xor 13 13 ... ... ... n xor n n
ОДРЕЂИВАЊЕ ЛИСТЕ ВРЕДНОСТИ KEY2 key2i+1 =crc32(key2i , MSB(key1i+1 )); key2i = crc32-1 (key2i+1 , MSB(key1i+1)) = (key2i+1 ‹‹ 8) xor crcinvtab[MSB(key2i+1 )] xor MSB(key1i+1 ); temp = key2 | 3; key3 = LSB((temp*(temp xor 1) » 8); key2 Претпоставља се да је фиксирана вредност key2i+1 key2i+1 2-31 temp ??????11 10-31 0-31 temp*(temp xor 1) key2i+1 ‹‹ 8 crcinvtab[MSB(key2i+1 )] MSB(key1i+1) 10-31 2-15 key3 key2i (key2i+1‹‹8) xor crcinvtab[MSB(key2i+1 )] xor MSB(key1i+1 ) кey3 – 256 могућих вредности; key3 зависи од битова 0-15 temp; На позицијама 0-1 temp налазе се јединице; Битови 0-15 temp зависе од битова 2-15 кey2; key3 зависи од битова 2-15 key2; Свака од key3 може се добити од 214/28 = 26 вредности доњих 16 битова key2; 216могућности за горњих 16 битова key2; За неку фиксирану key3, постоји 222могућих вредности горњих 30 битова key2 битови 10-15 се поклапају – морају бити исти key2i-64 могуће вредности за битове на позицијама 2-15; Вредности битова на позицијама 10-15 се поклапају; У просеку 2-6 могућихвредности битова 2-15 key2iдаје одговарајућу вредност key2i+1. Преостаје у просеку једна (64 * 2-6) вредност key2i, ако је позната вредност key2i+1. У просеку не значи увек и само једна (може их бити 0-5). Наставља се иста дискусија за key2i-1, key2i-2 ... Добија се око 222 могућих листа вредности (key2n, key2n-1,..., key22) Комплетне вредности key2i добијају се применом формуле: key2i+1 =crc32(key2i , MSB(key1i+1 ));
РЕДУКОВАЊЕ БРОЈА МОГУЋИХ ВРЕДНОСТИ KEY2 • Број листа вредности (key2n, key2n-1, ... , key22) приближно је једнак броју могућих вредности key2n • Ако је познато више од 13 бајтова отвореног текста врши се редукција броја могућих кандидата за key2n. • Неке вредности key2n не дају ни једну вредност key2n-1, а неке различите вредности key2n дају исту вредност key2n-1. Ти дупликати се одбацују. Преостали број кандидата за key2n-1 је значајно мањи од броја кандидата за key2n.
ОДРЕЂИВАЊЕ ЛИСТЕ ВРЕДНОСТИ KEY1 key2i+1 =crc32(key2i , MSB(key1i+1 )); MSB(key1i+1 )) =crc32-1 (key2i+1 , key2i ) = (key2i+1 ‹‹ 8) xor crcinvtab[MSB(key2i+1 )] xor key2i ; На основу познате листе (key2n, key2n-1, ... , key22)одређује се листа (MSB(key1n), MSB(key1n-1), ... , MSB(key13)). key1i+1 = (key1i + LSB(key0i+1))*134775813+1 (mod32) key1i + LSB(key0i+1) = (key1i+1 – 1)*134775813-1 (mod32) key1n- 224 могућности за доња 24 бита; 2-8 од њих је у одговарајућој вези са key1n-1; Добија се 216 одговарајућих вредности за key1n; За једну конкретну вредност key1nдобија се јединствена вредност key1n-1 + LSB(key0n). LSB(key0n) узима једну од 256 вредности. MSB(key1n-2) је познат, па само 2-8 вредности key1n-1 + LSB(key0n) води ка одговарајућој key1n-2 У просеку: једна фиксирана вредност key1n Води ка једној вредности key1n-1. У просеку не значи увек и само једна, може их бити две. key1i + LSB(key0i+1) * 134775813 1 + mod32 key1i+1 За једну конкрену листу (key2n, key2n-1, ... , key22) добија се око 216 могућих листа вредности (key1n, key1n-1, ... , key14).
ОДРЕЂИВАЊЕ ЛИСТЕ ВРЕДНОСТИ KEY0 На основу добијене листе (key1n, key1n-1, ... , key14) добија се листа (LSB(key0n), LSB(key0n-1),.., LSB(key05)).На основу познатих key1iи key1i+1 добија се LSB(key0i+1) коришћењем формуле: LSB(key0i+1) = ((key1i+1 – 1) * 134775813-1) – key1i (mod32). key0i и key0i+1су повезани формулом:key0i+1=crc32(key0i, Pi), тј. key0i+1 = (key0i » 8) xor crctab[LSB(key0i) xor Pi]. Одатле се добија формула: (key0i » 8) = key0i+1 xor crctab[LSB(key0i) xor Pi]. key0n-1 0-7 0-7 key0n-1 0-15 key0n xor key0n-2 0-23 0-31 Аналогно се добијају: crctab[LSB(key0n) xor Pn] key0n-3 0-31 Из key0n-3 применом формуле key0i=crc32-1 (key0i+1, Pi) добијају се key0n-4, key0n-5,…, key01. Упоређују се вредности бајтова најмање тежине добијених вредности key0n-4, key0n-5, key0n-6, keyn-7и key0n-8 са већ познатим LSB(key0n-4), LSB(key0n-5),…,LSB(key05). Пореде се 5 бајтова и добија се подударање у 2-40случаја.С обзиром да има 238 кандидата, гарантује се добијање јединствене (праве) листе вредности key0i. n-8 = 5 n=13 - неопходан број познатих бајтова отвореног текста
ОДРЕЂИВАЊЕ ИНТЕРНОГ КЉУЧА Ако је позната вредност интерног кључа у неком тренутку (key0i, key1i, key2i) могу се само на основу шифрата дешифровати преостали подаци и добити интерни кључ у било ком тренутку. (key0i+1, key1i+1, key2i+1) се добија коришћењем функције update_keys, а (key0i-1, key1i-1, key2i-1) се добија низом формула (Ci– шифрат, Pi– дешифрован знак): key2i-1 = crc32-1 (key2i, MSB(key1i)); key1i-1 = ((key1i – 1) * 134775813-1) – LSB(key0i) (mod 32); tempi-1 = key2i-1 | 3; key3i-1 = LSB((tempi-1 * (tempi-1 xor 1)) » 8); Pi-1 = Ci-1 xor key3i-1; key0i-1 = crc32-1 (key0i, Pi-1);
ОДРЕЂИВАЊЕ ЛОЗИНКЕ На основу вредности интерног кључа (key01, key11, key21) одређује се лозинка која је коришћена за шифровање. Испитују се лозинке различитих дужина у растућем поретку: 0,1,2,... У зависности од дужине лозинке (l) примењује се један од три поступка: • Ако је l ≤ 4, лозинка се директно добија из key01. • Ако је 5 ≤ l ≤ 6, одређује се key20, key10 и key2-1, затим потенцијалне листе key2i, и key1i,i=-4(-5),…,0 које се формирају у првом кораку шифровања, а одатле пети (и шести) знак лозинке. Прва четири знака проналазе се као код лозинки дужине четири. • Ако је l>6,првих l-6 знакова узимају се на све могуће начине, а за последњих шест примењује се поступак као код одређивања лозинки дужине шест.
АНАЛИЗА ЕФИКАСНОСТИ Време потребно за одређивање лозинке Време потребно за одређивање интерног кључа