W O J S K O W A A K A D E M I A T E C H N I C Z N A ROZPRAWA DOKTORSKA kpt mgr inż. Przemysław RODWALD PARAMETRYZOWANA KRYPTOGRAFICZNA FUNKCJA SKRÓTU PHAL-256 Promotor dr ha. inż. Janusz STOKŁOSA WARSZAWA 2008
Na wstępnie chciałym podziękować promotorowi mojej pracy dr. ha. Januszowi Stokłosie za umiejętność zadawania mi pytań, które doprowadzały mnie do stopniowego wgłęiania się w zagadnienie tworzenia funkcji skrótu, a w finale doprowadziły do powstania niniejszej rozprawy. Dziękuję także Dyrekcji Wojskowego Instytutu Łączności za stworzenie warunków do adań oraz za umożliwienie rania udziału w konferencjach kryptograficznych. Podziękowania swoje kieruję także do kierownika Zakładu Kryptografii Wojskowego Instytutu Łączności dr. inż. Marka Leśniewicza, za uwierzenie w moje możliwości. Powierzenie mi funkcji Wykonawcy Odpowiedzialnego dużego projektu kryptograficznego w trakcie prac nad dysertacją, wrew pozorom, dodatkowo zmotywowało mnie do zwiększonego wysiłku nad moimi adaniami. Chciałym podziękować także moim Kolegom z Zakładu Kryptologii: dr. inż. Roertowi Wicikowi i dr. inż. Mariuszowi Borowskiemu - za cenne rady i udostępnienie wielu implementacji, których wykorzystanie ułatwiło mi znacznie pracę, inż. Grzegorzowi Łauzkowi - za zweryfikowanie implementacji algorytmu. Szczególne podziękowania składam zaś mojej Żonie. Jej poświęcenie w wychowywanie naszego syna motywowało mnie każdego dnia do intensywniejszej pracy nad niniejszą rozprawą. 2
SPIS TREŚCI SPIS TREŚCI...3 OZNACZENIA...5 1. WPROWADZENIE...6 2. FUNKCJE SKRÓTU...8 2.1. WŁASNOŚCI... 10 2.2. ZASTOSOWANIE... 11 2.3. METODY ATAKÓW... 13 2.3.1. ATAKI OGÓLNE...13 2.3.2. ATAKI ŁAŃCUCHOWE...15 2.3.3. ATAKI NA FUNKCJĘ KOMPRESUJĄCĄ...18 2.4. METODY DOPEŁNIANIA... 19 2.5. STRUKTURY ITERACYJNE... 20 3. DEDYKOWANE FUNKCJE SKRÓTU...24 3.1. PRZEGLĄD WSPÓŁCZESNYCH FUNKCJI... 24 3.2. AKTUALNY STAN KRYPTOANALIZY... 31 4. PHAL-256 PARAMETERIZED HASH ALGORITHM...37 4.1. DOPEŁNIANIE WIADOMOŚCI... 37 4.2. SCHEMAT ITERACYJNY... 38 4.3. WEKTOR INICJUJĄCY... 38 4.4. MODYFIKACJA WIADOMOŚCI... 38 4.5. WARTOŚCI STAŁE... 39 4.6. FUNKCJA KOMPRESUJĄCA... 40 4.7. BLOKI PODSTAWIEŃ... 43 5. KRYTERIA PROJEKTOWE FUNKCJI PHAL-256...45 5.1. DOPEŁNIENIE WIADOMOŚCI... 49 5.2. SCHEMAT ITERACYJNY... 49 5.3. WEKTOR INICJUJĄCY... 50 5.4. MODYFIKACJA WIADOMOŚCI... 51 5.5. WIELKOŚCI STAŁE... 53 5.6. FUNKCJA KOMPRESUJĄCA... 54 5.6.1. FUNKCJE JEDNOARGUMENTOWE...54 5.6.2. FUNKCJE TRÓJARGUMENTOWE...57 5.7. BLOKI PODSTAWIEŃ... 58 3
5.7.1. FUNKCJE BENT...58 5.7.2. METODA GENERACJI BLOKÓW PODSTAWIEŃ...60 5.7.3. PARAMETRY BLOKÓW PODSTAWIEŃ...63 6. BEZPIECZEŃSTWO I EFEKTYWNOŚĆ...65 6.1. ODPORNOŚĆ NA KRYPTOANALIZĘ... 65 6.2. TESTY STATYSTYCZNE... 67 6.3. EFEKTYWNOŚĆ... 72 7. IMPLEMENTACJA...74 7.1. KODY ŹRÓDŁOWE Z JĘZYKU C... 74 7.2. KODY ŹRÓDŁOWE W JĘZYKU PASCAL... 76 7.3. OPTYMALIZACJA KODU... 78 7.4. ZGODNOŚĆ IMPLEMENTACJI... 79 8. PODSUMOWANIE...80 9. DODATKI...82 SPISY RYSUNKÓW, TABEL I ALGORYTMÓW...83 LITERATURA...85 4
OZNACZENIA Operatory XOR, różnica symetryczna, alternatywa wykluczająca, suma modulo 2 dodawanie modulo 2 32 odejmowanie modulo 2 32 mnożenie modulo 2 32 negacja itowa koniunkcja itowa (zamiast x y stosowany jest także zapis uproszczony xy) alternatywa itowa konkatenacja x «n przesunięcie logiczne w lewo słowa x o n itów x» n przesunięcie logiczne w prawo słowa x o n itów x n cykliczne przesunięcie logiczne (rotacja) w lewo słowa x o n itów x n cykliczne przesunięcie logiczne (rotacja) w prawo słowa x o n itów Wielkości IV wektor inicjujący (ang. initial value, initial vector) m wiadomość (ang. message) h funkcja skrótu (ang. hash function) ϕ funkcja kompresująca (ang. compression function) Akronimy NSA National Security Agency (tł. Agencja Bezpieczeństwa Narodowego) NIST National Institute of Standards and Technology (tł. Narodowy Instytut Standaryzacji i Technologii) SHA Secure Hash Algorithm (tł. Bezpieczny Algorytm Skrótu) RIPE RACE Integrity Primitives Evaluation 5
1. WPROWADZENIE Funkcje skrótu odgrywają ardzo ważną rolę w kryptografii. Wiele osó nawet nie zdaje soie sprawy jak często każdego dnia nieświadomie wykorzystuje funkcje skrótu, na przykład podczas korzystania z Internetu, czy też podczas używania kart płatniczych. Funkcje skrótu stosowane są do przechowywania haseł w systemach operacyjnych, czy też azach danych. Używa się ich na szeroką skalę w celu adania integralności programów, różnego rodzaju łat i uaktualnień, czy też sygnatur wirusów. Znalazły one także szerokie zastosowanie w różnych protokołach, m.in. SSL, SSH, IPsec. Stosowane są również w generatorach ciągów pseudolosowych. Jednym z ardzo ważnych zastosowań funkcji skrótu są schematy podpisu cyfrowego, gdzie zamiast podpisywać cały dokument, podpisuje się tylko jego skrót. Podpisywany dokument może zawierać w soie istotne informacje finansowe. Jeśli więc uda się stworzyć podroiony dokument zawierający inne dane, ale dający w wyniku ten sam skrót, to może mieć to poważne następstwa finansowe. Można więc wyrazić tezę, iż ezpieczne, odporne na kolizje funkcje skrótu są ezcenne w doie społeczeństwa informatycznego. Ostatnie lata przyniosły wiele ciekawych prac w zakresie kryptoanalizy funkcji skrótu [130,132,133,135]. Funkcje, które uważano za ezpieczne i które yły powszechnie stosowane (np. MD5, SHA-0, SHA-1), okazały się podatne na współczesne ataki. Z tego względu, pod koniec roku 2007, NIST ogłosił konkurs na nową funkcję skrótu pod nazwą SHA-3 [87]. Jedną z pożądanych cech nowego standardu ma yć elastyczność. Rozumiana jest ona między innymi jako możliwość dostrajania funkcji skrótu do potrze użytkownika. Ma to umożliwiać kompromis pomiędzy ezpieczeństwem a wydajnością. Istnieje więc potrzea stworzenia nowych, parametryzowanych funkcji skrótu odpornych na współczesne metody kryptoanalizy. Celem niniejszej pracy jest zaprojektowanie i implementacja parametryzowanej kryptograficznej funkcji skrótu. Prowadzone w rozprawie rozważania służą wykazaniu następującej tezy: możliwe jest skonstruowanie efektywnej, parametryzowanej funkcji skrótu, odpornej na znane metody kryptoanalizy. Poszczególne zadania cząstkowe zrealizowane w pracy to: analiza różnych konstrukcji współczesnych funkcji skrótu, analiza struktur iteracji stosowanych w funkcjach skrótu, analiza aktualnego stanu kryptoanalizy funkcji skrótu, postawienie celów projektowych dla tworzonej funkcji skrótu, 6
projekt dedykowanej funkcji skrótu z podziałem na: o schemat iteracyjny, o funkcję kompresującą, implementacja zaprojektowanej funkcji skrótu: o w języku C, o w języku Pascal, ocena efektywności zaprojektowanej funkcji skrótu, adania statystyczne sekwencji generowanych przez funkcję skrótu, analiza odporności zaprojektowanej funkcji na współczesne metody kryptoanalizy. Układ całej rozprawy przedstawia się następująco. W niniejszym rozdziale dokonano wprowadzenia w tematykę funkcji skrótu oraz uzasadniono wyór tematu. Przedstawiono także cel pracy, sformułowano tezę oraz zadania cząstkowe. Rozdział drugi rozpoczyna się zdefiniowaniem podstawowych pojęć, następnie opisuje się własności funkcji skrótu, ich zastosowanie we współczesnych systemach teleinformatycznych, znane metody kryptoanalizy oraz ich systematyzację, dokonuje przeglądu metod dopełniania skracanych wiadomości oraz przedstawia schematy struktur iteracyjnych. W kolejnym rozdziale przedstawiono kilka współczesnych funkcji skrótu, zarówno te, które są ardzo popularne i powszechnie używane, jak i te, które są mniej znane, ale charakteryzują się ciekawą konstrukcją i okazały się skutecznie opierać atakom kryptoanalityków. W dalszej części pokazano aktualny stan kryptoanalizy znanych funkcji skrótu. W kluczowym, czwartym rozdziale zaproponowano nowy algorytm wyznaczania skrótu. W szczególności zaprezentowano ogólną strukturę funkcji skrótu z autorskim schematem iteracyjnym oraz własną funkcją kompresującą. W rozdziale piątym przedstawiono kryteria projektowe, którymi kierowano się przy konstrukcji funkcji skrótu. Omówiono zasadność wyoru funkcji oolowskich wchodzących w skład projektowanej funkcji kompresującej. Przedstawiono metodę generacji kryptograficznych loków podstawień. Uzasadniono wyór mechanizmu dopełniania i modyfikacji wiadomości. Szczególną uwagę poświęcono także schematowi iteracyjnemu. Kolejny rozdział zawiera analizę ezpieczeństwa zaproponowanej funkcji, jej odporność na znane metody kryptoanalizy oraz wyniki testów statystycznych generowanych przez funkcję sekwencji. Przedstawiono także porównanie efektywności funkcji PHAL-256 z innymi, popularnymi funkcjami skrótu. W podsumowaniu przedstawiono rezultaty niniejszej pracy adawczej, której integralną część stanowią kody źródłowe wszystkich procedur adawczych oraz samej funkcji skrótu. 7
2. FUNKCJE SKRÓTU Historia pojęcia funkcji jednokierunkowej, która nie musiała yć funkcją kompresującą zaczyna się prawdopodonie od pracy Diffiego i Hellmana [33], gdzie autorzy opisują potrzeę jej stosowania w procesie uwierzytelniania w kryptografii. Mimo, iż nie nazwali jeszcze funkcji jednokierunkowej funkcją skrótu, to jednak wprowadzają wymóg na odporność funkcji na znalezienie przeciworazu oraz wymóg słaej ezkolizyjności (pojęcia te zostały zdefiniowane w dalszej części pracy). Właściwy termin funkcja skrótu (ang. hash function) pochodzi prawdopodonie z pracy Merklego [75], lu Raina [103]. Oie pozycje skupiają się na uwierzytelnianiu wiadomości, nie podkreślając jednak wymogu silnej ezkolizyjności. W tymże czasie Rivest, Shamir i Adleman przedstawiają swoją koncepcję realizacji kryptografii klucza pulicznego. Davida [28] pokazuje atak z wyraną wiadomością na schemat podpisu zaproponowany przez RSA. Konsekwencją tego ataku i kilku innych prac jest sugestia środowiska kryptograficznego na zastosowanie funkcji skrótu w schemacie podpisu cyfrowego celem wyeliminowania jego słaości oraz przyśpieszenia procesu podpisywania wiadomości. Wówczas też wprowadzono dla funkcji skrótu wymagania na jednokierunkowość oraz słaą i silną ezkolizyjność [31,139]. W dzisiejszych czasach uważa się, iż funkcja skrótu powinna spełniać trzy wyżej wymieniowe właściwości. Czasami także nieformalnie wymaga się także, ay ciąg itów otrzymywany na wyjściu funkcji skrótu wyglądał losowo [25]. Pod pojęciem funkcji skrótu h rozumie się, łatwe oliczeniowo przekształcenie odwzorowujące wiadomość m o dowolnej, skończonej długości, w ciąg itów o określonej, stałej długości n - h : {0,1} {0,1} * n *, gdzie: {0,1} = U i Ν {0,1} i, N = {0,1,2, }. Ze względu na wykorzystanie funkcji skrótu, można je podzielić na dwie zasadnicze grupy: MDC kody wykrywania modyfikacji (ang. Modification Detection Codes), MAC kody uwierzytelniające wiadomości (ang. Message Authentication Codes). Jak sama nazwa wskazuje pierwsza grupa służy wyłącznie do adania integralności danych, a więc sprawdzenia czy dane zostały zmodyfikowane (przypadkowo, ądź też w sposó zamierzony). Natomiast druga grupa służy oprócz tego do uwierzytelnienia danych, czyli zweryfikowania czy dane zostały wytworzone przez określone źródło. Oczywistym jest więc, że kody uwierzytelniające muszą yć powiązane z kluczem służącym identyfikacji źródła. Kody wykrywania modyfikacji, zwane także kodami wykrywania manipulacji dzielą się na dwie podgrupy (rys. 2.1): OWHF jednokierunkowe funkcje skrótu (ang. One Way Hash Functions), CRFH funkcje skrótu odporne na kolizje (ang. Collision Resistance Hash Functions). Szczegółowy opis powyższych pojęć znajduje się w następnym rozdziale niniejszej pracy. 8
Funkcje skrótu MDC MAC OWHF CRHF Rys. 2.1 Podział funkcji skrótu. Ze względu na użytą funkcję kompresującą, funkcje skrótu możemy podzielić na trzy grupy: Funkcje skrótu oparte na szyfrach lokowych W tej grupie jako funkcji kompresującej używa się szyfru lokowego. Podejście takie jest uważane za ezpieczne, gdyż polega się tutaj na ezpieczeństwie, dorze przeadanych, szyfrów lokowych. Główną zaletą tego podejścia jest redukcja kosztów związanych z projektowaniem i implementacją, gdyż wykorzystuje się istniejące szyfry lokowe [100]. Z drugiej strony użycie szyfru lokowego implikuje czasochłonne operacje generowania podkluczy, co w praktyce dyskwalifikuje użycie tej grupy funkcji skrótu w systemach zorientowanych na efektywność przetwarzanych informacji. Zostało dowiedzione [18], iż nie da się skonstruować wysoce efektywnej iteracyjnej funkcji skrótu opartej na szyfrach lokowych, dla której ezpieczeństwo jest możliwe do udowodnienia. Dedykowane funkcje skrótu Funkcje tej grupy używają specjalnie zaprojektowanych funkcji kompresujących. Należą do niej wszystkie funkcje przedstawiane w niniejszej pracy (MD/SHA, TIGER, itd.). Ze względu na swoją konstrukcję dedykowane funkcje skrótu są ardzo szykie i najpowszechniej stosowane we współczesnych systemach teleinformatycznych. Funkcje skrótu oparte na strukturach algeraicznych Do tej grupy zalicza się funkcje oparte przykładowo na: prolemie plecakowym, krzywych eliptycznych, prolemie faktoryzacji, czy też arytmetyce modularnej (funkcje MASH [73]). Ich ezpieczeństwo opiera się na pewnym trudnym prolemie matematycznym. Funkcje te są oecnie używane sporadycznie, głównie ze względu na małą efektywność. Większość współczesnych, dedykowanych funkcji skrótu ma naturę iteracyjną. Oznacza to, iż wiadomość m jest dzielona na k loków o określonej długości i podawana kolejno na wejście 9
funkcji kompresującej. Wyjście funkcji kompresującej jest podawane w kolejnych iteracjach (oprócz ostatniej) na wejście tejże funkcji kompresującej wraz z kolejnym lokiem wiadomości. Na zakończenie stosowane może yć także pewne przekształcenie wyjściowe ψ. Iteracyjny algorytm wyznaczania skrótu h(m) ma następującą postać (rys 2.2): CV CV 0 i + 1 = IV = ϕ( CV, m h( m) = ψ ( CV i k ) i ), i = 0,1,..., k 1 gdzie: IV wektor inicjujący, CV wektor łańcuchowy, ϕ funkcja kompresująca, ψ przekształcenie wyjściowe. Rys. 2.2 Struktura iteracyjnych funkcji skrótu. Wiadomość przed skróceniem zostaje podzielona na loki o równej, określonej dla danej funkcji, długości. W tym celu przed skróceniem wiadomość jest poddawana procedurze dopełnienia. Istotnym elementem tej procedury jest umieszczanie w wiadomości informacji o jej oryginalnej, pierwotnej długości. Umożliwia to odróżnienie ciągu oryginalnej wiadomości od dodawanego ciągu itów dopełnienia. Metody dopełniania wiadomości zostały przedstawione w dalszej części niniejszej pracy. 2.1. WŁASNOŚCI Zadania, przed którymi stoją funkcje skrótu, czynią je niejako odpowiednikiem odcisku palca w świecie cyfrowym. Oczekuje się więc od nich, ay w sposó szyki i jednoznaczny identyfikowały dane cyfrowe. Oznacza to w praktyce, iż nawet małe zmiany (na przykład zmiana jednego itu) w skracanym ciągu danych powinny dać w rezultacie zupełnie inny skrót (średnio zmianę połowy itów skrótu). Nie powinno yć także możliwości odtworzenia wiadomości ory- 10
ginalnej mając tylko jej skrót oraz nie powinno yć możliwości utworzenia dwóch różnych wiadomości dających ten sam skrót. Wymagania można sformalizować następująco: Nieodwracalność (ang. preimage resistance, non-invertility): Dany jest skrót h(m), wiadomość m jest nieznana. Znalezienie wiadomości m jest oliczeniowo trudne. Słaa ezkolizyjność (ang. 2nd preimage resistance, weak collision resistance): Dany jest skrót h(m) i odpowiadająca mu wiadomość m. Znalezienie wiadomości m m takiej, że h(m)=h(m ) jest oliczeniowo trudne. Bezkolizyjność (ang. collision resistance, strong collision resistance): Oliczeniowo trudne jest znalezienie dowolnej pary różnych wiadomości m i m takich, że h(m)=h(m ). Warunek ezkolizyjności [115] implikuje słaą ezkolizyjność, nie gwarantuje natomiast nieodwracalności. Pod pojęciem prolemu trudnego oliczeniowo rozumie się atak, którego złożoność oliczeniowa w praktyce jest tak duża (teoretycznie: wykładnicza), że przy współcześnie istniejącej technice oraz stanie wiedzy, staje się on praktycznie niewykonalny. W literaturze szeroko stosowane są również następujące oznaczenia funkcji skrótu [129]: jednokierunkowa funkcja skrótu (ang. OWHF One Way Hash Function): spełnienie własności nieodwracalności i słaej ezkolizyjności, ezkolizyjna funkcja skrótu (ang. CRHF Collision Resistance Hash Function): spełnienie własności nieodwracalności i ezkolizyjności, uniwersalna jednokierunkowa funkcja skrótu (ang. UOWHF Universal One-Way Hash Function) [84]: rodzina funkcji skrótu składająca się ze skończonego zioru funkcji skrótu o jednakowym prawdopodoieństwie użycia; użycie wyranej instancji jest warunkowane parametrem (kluczem). 2.2. ZASTOSOWANIE We współczesnym świecie, gdzie informacja i dane stają się cennym towarem, funkcje skrótu odgrywają kluczową rolę w zapewnieniu ezpieczeństwa. W niniejszym rozdziale zostaną przedstawione najpopularniejsze zastosowania funkcji skrótu z podaniem rzeczywistych systemów, w których funkcjonują. Usługi certyfikacyjne Kategoria ta składa się z protokołów certyfikacyjnych. Najważniejszym wykorzystaniem funkcji skrótu tej grupy są schematy podpisu cyfrowego. W schematach tych podpisywana nie jest sama wiadomość, ale właśnie jej skrót wyliczany za pomocą funkcji skrótu. Innym wykorzystaniem funkcji skrótu są znaczniki czasowe wykorzystywane w usługach certyfikacyjnych. 11
Uwierzytelnienie Grupa protokołów potwierdzająca tożsamość klienta. Jednym z przykładów jest system Kereros, który dostarcza mechanizmy uwierzytelniania, chroni przed podsłuchiwaniem oraz zapewnia integralność danych w modelu klient-serwer. W systemie funkcje skrótu wykorzystywane są do wyliczania skrótu wprowadzanego przez klienta hasła, który to w dalszej części protokołu staje się tajnym kluczem klienta. Inne protokoły tej grupy to: IEEE802.1X-EAP czy APOP. Bezpieczna komunikacja Grupa zawierająca w soie protokoły wymiany klucza. Jednym z najpopularniejszych protokołów tej grupy jest szeroko stosowany IPsec. Zapewnia on ezpieczną komunikację w warstwie sieciowej poprzez szyfrowanie i uwierzytelnianie pakietów IP. Protokół wymiany klucza (IKE Internet Key Exchange) zastosowany w IPsec używa funkcji skrótu do generacji ciągów pseudolosowych. Dodatkowo funkcja skrótu jest używana do weryfikacji integralności i uwierzytelnienia wszystkich wiadomości przesyłanych w tym protokole. Innym przykładem jest protokół SSH, który zapewnia uwierzytelnianie użytkowników i tworzy ezpieczny kanał pomiędzy lokalnym a zdalnym komputerem. SSH wykorzystuje funkcje skrótu jako kody uwierzytelniające wiadomości (MAC). To samo zastosowanie funkcji skrótu wykorzystane jest w protokole SSL/TLS. Bezpieczna poczta elektroniczna Kategoria zapewniająca ezpieczną wymianę wiadomości e-mail, ochronę prywatności i sprawdzanie integralności wiadomości. Protokół S/MIME używa funkcji skrótu w schemacie podpisu cyfrowego, zapewniając autentyczność i integralność przesyłanych wiadomości. Również jedno z najpopularniejszych narzędzi do szyfrowania poczty elektronicznej PGP (Pretty Good Privacy), używa funkcji skrótu dla zapewnienia integralności wiadomości e-mail. Przechowywanie haseł Większość współczesnych systemów informatycznych nie przechowuje haseł w postaci jawnej, lecz wykorzystuje funkcje skrótu do tworzenia skrótów haseł, które następnie są przechowywane w systemie. Rozwiązania takie spotykane są powszechnie w większości systemów az danych (np. Oracle, MySQL) oraz w systemach operacyjnych (np. Windows, UNIX). Aktualizacja oprogramowania Systemy aktualizacji oprogramowania (łaty, aktualizacje, sygnatury wirusów) wykorzystują funkcje skrótu w celu weryfikacji integralności oprogramowania. 12
2.3. METODY ATAKÓW Jednym z celów stosowania funkcji skrótu jest stworzenie skrótu, dla którego ędzie oliczeniowo trudne znalezienie innej wiadomości dającej ten sam skrót. Jak łatwo się domyśleć cele przeciwnika są odwrotne. Pierwszym z ataków ędzie próa odtworzenia wiadomości, dla której dany jest skrót. Atak ten jest szczególnie przydatny przy łamaniu różnego rodzaju haseł. Drugim rodzajem ataku może yć próa stworzenia innej wiadomości dającej w wyniku ten sam skrót. Ten atak może yć stosowany w schematach podpisu cyfrowego, gdzie atakujący ędzie starał się zmodyfikować oryginalną wiadomość, czy też w systemach aktualizacji oprogramowania, gdy atakujący ędzie chciał umieścić pewien złośliwy kod w oprogramowaniu. Trzecim rodzajem ataku może yć próa stworzenia dwóch różnych wiadomości dających ten sam skrót. Te trzy rodzaje ataków odpowiadają kryteriom stawianym funkcjom skrótu, a więc jednokierunkowości oraz słaej i silnej ezkolizyjności. Dorze zaprojektowana funkcja skrótu powinna yć odporna na powyższe ataki. Poziom ezpieczeństwa funkcji skrótu określa się przez złożoność najlepszego znanego ataku na tę funkcję. Złożoność może yć rozpatrywana dla funkcji skrótu w dwóch aspektach: złożoność oliczeniowa licza operacji niezędna do przeprowadzenia ataku, złożoność pamięciowa licza jednostek pamięci niezędna do ataku. Ataki na funkcje skrótu można podzielić na następujące kategorie: ataki ogólne zależne wyłącznie od długości skrótu, niezależne od użytego algorytmu, ataki łańcuchowe zależne od struktury mechanizmu iteracji, ataki na funkcję kompresującą zależne od konstrukcji funkcji kompresującej. 2.3.1. ATAKI OGÓLNE Do tej grupy ataków ogólnych zalicza się wszystkie ataki niezależne ani od szczegółów konstrukcyjnych funkcji kompresującej, ani od mechanizmu skracania wiadomości wielolokowych. Ta klasa ataków zależy wyłącznie od długości skrótu generowanego przez funkcję. Do tej klasy ataków należy atak rutalny, wraz z jego modyfikacjami, oraz atak urodzinowy. Atak rutalny (ang. rute-force attack) Ideą ataku rutalnego jest próa znalezienia oryginalnej wiadomości mając dany jedynie jej skrót. Jest to atak na jednokierunkowość funkcji skrótu, gdyż zadaniem atakującego jest uzyskanie przeciworazu skrótu. Analizując atak rutalny można wyorazić soie dwa skrajne podejścia. Pierwsze, zwane czasami w literaturze metoda czasową, polega na sprawdzaniu (kolejno, lu losowo) wszystkich możliwych wiadomości. Atakujący wyiera wiadomość, tworzy jej skrót i porównuje ze wzorcem. Czynność ta jest powtarzana do czasu, aż atakujący uzyska 13
poszukiwany skrót. Złożoność oliczeniowa takiego ataku wynosi O(2 n ), gdzie n jest długością skrótu, natomiast złożoność pamięciowa jest stała. Bardziej ogólnie można powiedzieć, iż znalezienie przeciworazu z prawdopodoieństwem ε wymaga złożoności O( 2 n +log 2 ε ). Drugim skrajnym podejściem łamania rutalnego jest sytuacja, gdy atakujący jednorazowo przygotuje soie talicę wszystkich możliwych skrótów i odpowiadającym im wiadomościom. W tym przypadku odszukanie wzorca w talicy ędzie stosunkowo szykie (np. rzędu O(n), lu rzędu O(log n) dla talicy posegregowanej), natomiast złożoność pamięciowa ędzie rzędu O(2 n ). Oa podejścia są czysto teoretyczne, gdyż dla współczesnych funkcji skrótu, o długości skrótu co najmniej 160 itów, ataki takie są nieefektywne. Kompromis czasowo-pamięciowy (ang. time-memory trade-off) Istnieje pewne pośrednie rozwiązanie noszące w literaturze nazwę kompromisu czasowopamięciowego. Metoda ta została przedstawiona już w 1980 roku przez Hellmana [45]. Wymaga, tak jak atak rutalny, wykonania O(2 n ) wstępnych oliczeń, ale potem wymiar talicy i złożoność oliczeniowa redukują się do O(2 2n/3 ), gdzie n jest długością skrótu. W 2002 roku Wiener pokazuje, iż jeżeli mamy wygenerowanych 2 3n/5 skrótów, wówczas złożoność oliczeniowa ataku redukuje się do O(2 2n/5 ). W ostatnim czasie podejście Hellmana stało się wyjątkowo głośne ze wzglądu na pracę Oechslina [95]. Autor przedstawia zmodyfikowaną wersję tej metody opartą na tęczowych talicach oraz udostępnia oprogramowanie (ophcrack) wraz z azą danych (tęczowymi talicami) pozwalającą na łamanie 99.9% alfanumerycznych haseł systemu operacyjnego Windows w średnim czasie kilkunastu sekund. Atak urodzinowy (ang. irthday attack) Drugi rodzaj ataków w klasie ataków ogólnych stanowią ataki urodzinowe. Atakujący chce uzyskać dwie różne wiadomości dające ten sam skrót, a więc jest to atak na ezkolizyjność. U podstaw tego ataku leży paradoks dnia urodzin, który pozwala oczekiwać, że kolizja zostanie znaleziona znacznie szyciej niż sugerowały to rozmiar przeciwdziedziny funkcji skrótu. W klasycznej postaci paradoks ten rzmi następująco: Ile osó należy wyrać, żey prawdopodoieństwo zdarzenia, że co najmniej dwie z nich mają urodziny tego samego dnia w roku, yło większe od jednej drugiej? Odpowiedź jest zaskakująca: tylko 23 osoy. Przełożenie tego paradoksu na funkcje skrótu jest następujące. Atakujący generuje r 1 fałszywych wiadomości oraz r 2 prawdziwych wiadomości. Oczekiwana licza kolizji wynosi r 1 r 2 /n, gdzie n jest długością skrótu. Prawdopodoieństwo znalezienia pary fałszywej i prawdziwej wiadomości dającej ten sam skrót wynosi 1 e r r 1 2 n 2. Ay uzyskać kolizję z prawdopodoieństwem większym od ½ wystarczy sprawdzić r 1 = r 2 = 2 2 n wiadomości. Prawdopodoieństwo to wynosi dokładnie 0.63. Bardziej ogólnie można powiedzieć, iż znalezienie kolizji z prawdopodoieństwem ε wymaga n 2 2 2log(1 ε ) wywołań funkcji skrótu. 14
Jeden z pierwszych, a zarazem najardziej znanych ataków urodzinowych został przedstawiony w 1977 roku przez Yuvala [140]. Na wejściu ataku mamy prawdziwą wiadomość m 1 oraz fałszywą wiadomość m 2. Dysponujemy funkcją skrótu h dającą n-itowy skrót. Na wyjściu algorytmu otrzymujemy zmodyfikowane wiadomości m 1 i m 2 różniące się nieznacznie od swoich pierwowzorów i spełniające warunek h(m 1 ) = h(m 2 ). Algorytm znajdujący kolizję przedstawia się następująco: utwórz 2 n/2 niewielkich modyfikacji m 1 wiadomości m 1, dla każdej wiadomości m 1 wygeneruj skrót h(m 1 ) i zapisz go, utwórz 2 n/2 niewielkich modyfikacji m 2 wiadomości m 2, dla każdej wiadomości m 2 wygeneruj skrót h(m 2 ) i sprawdź czy w ziorze zapisanych skrótów h(m 1 ) znajduje się skrót spełniający równanie h(m 1 ) = h(m 2 ). Również dla klasy ataków urodzinowych można znaleźć w literaturze kilka ulepszeń [102]. Jednym z nich jest wprowadzenie punktów wyróżniających (ang. distinguished points), które znacznie redukują potrzeną pamięć i czas. 2.3.2. ATAKI ŁAŃCUCHOWE Ataki łańcuchowe (ang. chaining attacks) wykorzystują iteracyjną naturę funkcji skrótu. Do tej grupy ataków należą: ataki wielolokowe, ataki ze spotkaniem w środku, ataki z wykorzystaniem punktów stałych oraz ataki wielokolizyjne. Atak wielolokowy (ang. multi-lock collision attacks MBCA) W 1989 roku Merkle [75] i Damgård [27] przedstawili niezależnie iteracyjną strukturę konstruowania ezkolizyjnych funkcji skrótu, wykorzystując do konstrukcji ezkolizyjne funkcje kompresujące. Od tego czasu konstrukcja ta nosi nazwę struktury Merkle-Damgårda i jest powszechnie stosowana we współczesnych funkcjach skrótu (np. MD5, SHA-1). Niestety konstrukcja ta, jak pokazują ostatnie ataki [12,133,134,135], jest podatna na znajdowanie kolizji atakiem wielolokowym. W celu opisania tej grupy ataków zostaną najpierw opisane pewne ataki pośrednie. Prawiekolizje (ang. near-collision) Prawiekolizje mają miejsce, gdy dla dwóch różnych wiadomości m i m (m m ) otrzymujemy skróty różniące się tylko na kilku itach, a więc parę skrótów, dla których odległość Hamminga jest mała (rys 2.3). 15
Rys. 2.3 Prawiekolizja. Pseudokolizje (ang. pseudo-collision) Pod pojęciem pseudokolizji rozumie się atak polegający na znalezieniu pary wiadomości m i m (m m ) które dla dwóch różnych wektorów inicjujących IV i IV (IV IV ) dają tej sam skrót h(iv,m) = h(iv,m ) (rys 2.4). Rys. 2.4 Pseudokolizja. Kolizje przy wyranym wektorze inicjującym (ang. semi-free-start collision) Rozpatrując sytuację, gdy wyieramy dowolny wektor inicjujący IV i znajdujemy dla niego dwie wiadomości m i m (m m ), które dają ten sam skrót h(iv,m) = h(iv,m ), otrzymujemy atak kolizyjny przy dowolnym wektorze inicjującym (rys 2.5). Rys. 2.5 Kolizje przy wyranym wektorze inicjującym. Wykorzystując powyższe ataki pośrednie można poszukiwać kolizji dla wielolokowych wiadomości. Dla najprostszego przypadku, tj. dla wiadomości dwulokowych schemat ataku ędzie wyglądał tak jak to przedstawiono na rys 2.6. 16
Rys. 2.6 Schemat ataku dwulokowego. Biorąc pod uwagę zależności pomiędzy lokami skracanych wiadomości możemy wyróżnić następujące przypadki dla ataków dwulokowych [39, 40]: MBCA-1 pierwsze loki wiadomości są soie równe, natomiast drugie loki różnią się: m 1 = m 1 i m 2 m 2. W drugim kroku mamy do czynienia z atakiem przy dowolnie wyranym wektorze inicjującym, natomiast pierwszy krok służy do znalezienia odpowiedniego wektora. MBCA-2 pierwsze loki wiadomości są różne, natomiast drugie loki są takie same: m 1 m 1 i m 2 = m 2. W drugim kroku mamy do czynienia z atakiem pseudokolizyjnym dla równych wiadomości i różnych wektorów inicjujących, natomiast pierwszy krok służy do znalezienia odpowiedniej pary wektorów. MBCA-3 pierwsze i drugie loki wiadomości są różne: m 1 m 1 i m 2 m 2. W drugim kroku mamy do czynienia z atakiem pseudokolizyjnym, natomiast pierwszy krok służy do znalezienia odpowiedniej pary wektorów inicjujących. Punkty stałe (ang. fixed-points) Innym atakiem wykorzystującym słaości schematu iteracyjnego MD jest atak na punkty stałe. Celem tego ataku jest znalezienie takiej wiadomości m, że dla funkcji kompresującej i i CV = ϕ( CV, m). Jak się okazuje wyznaczenie punktów stałych dla wielu znanych funkcji skrótu jest zadaniem stosunkowo prostym [56]. Wygenerowanie kolizji polega na znalezieniu pary wiadomości wielolokowych, takich że w jednej z nich znajduje się lok wiadomości dający punkt stały. Atak wielokolizyjny (ang. multicollision attack) W 2004 roku Joux [52] pokazał atak wielokolizyjny dla wiadomości wielolokowych (rys 2.7). Joux wykazał, iż znalezienie wielu (dokładnie 2 k, gdzie k jest dowolną liczą naturalną) kolidujących wiadomości, nie jest trudniejsze, niż znalezienie pojedynczej kolizji dla iteracyjnych funkcji skrótu korzystających ze schematu iteracyjnego MD. Mówiąc dokładniej, znalezienie 2 k kolizji wymaga k-razy tyle czasu ile wymaga znalezienie pojedynczej kolizji. Algorytm ataku przedstawia się następująco (alg. 2.1): 17
1. podstaw CV 0 = IV 2. dla i od 0 do k-1 wykonaj: a. znajdź dwie różne wiadomości m a i i m i takie że ϕ(cv i,m a i) = ϕ(cv i,m i). podstaw CV i+1 = ϕ(cv i,m a i) 3. wszystkie 2 k wiadomości: (m a 0,m a 1,..,m a k-1) (m a 0,m a 1,..,m k-1)... (m 0,m 1,..,m k 1) mają ten sam skrót Alg. 2.1 Algorytm ataku wielokolizyjnego. Rys. 2.7 Schemat ataku wielokolizyjnego. Atak ze spotkaniem w środku (ang. meet in the middle attack) Atak ten ma zastosowanie dla funkcji skrótu, dla których funkcja kompresująca jest łatwa do odwrócenia. Jest to wariant ataku urodzinowego na słaą ezkolizyjność o złożoności O(2 n/2 ), gdzie n jest długością skrótu. Niech wiadomość m ędzie konkatenacją dwóch loków m 1 oraz m 2, m = m 1 m 2. Atakujący generuje r 1 pierwszych części wiadomości m 1 oraz r 2 drugich części fałszywych wiadomości m 2. Rozpoczynając atak od wektora początkowego z jednej strony oraz od wartości skrótu z drugiej strony, prawdopodoieństwo spotkania w środku wynosi n r1 r2 2 1 e. 2.3.3. ATAKI NA FUNKCJĘ KOMPRESUJĄCĄ Ostanią klasę ataków stanowią ataki na funkcję kompresującą. Do klasy tej można zaliczyć wszystkie ataki próujące znaleźć słaości wewnątrz konkretnej funkcji kompresującej. Możemy mieć tutaj do czynienia na przykład z próami poszukiwania itów neutralnych, a więc itów, które wewnątrz funkcji kompresującej przez wiele rund (a nawet w ogóle) nie wpływają na zmiany zmiennych wewnętrznych algorytmu. Do tej klasy zaliczają się także ataki z wykorzystaniem techniki modyfikacji wiadomości, gdzie atakujący stara się tak doierać pary wiadomości, odpowiednio modyfikując poszczególne ity, ay uzyskać pełną lu wewnętrzną kolizję. 18
2.4. METODY DOPEŁNIANIA Oryginalna wiadomość przed skróceniem zostaje podzielona na loki o równej, określonej dla danej funkcji, długości. Czynność ta jest możliwa, jeśli długość wiadomości jest wielokrotnością liczy, określającej wielkość loku używanej funkcji skrótu. Dlatego też każdorazowo przed skróceniem wiadomości jest ona poddawana procedurze dopełnienia (ang. padding). Kluczowym elementem tej procedury jest umieszczanie w wiadomości informacji o jej oryginalnej, pierwotnej długości. Podejście to zwane jest wzmocnionym schematem MD (ang. MDstrengthening). Zaezpiecza ono funkcję skrótu między innymi przed: atakami z wykorzystaniem punktów stałych, atakami, w których wiadomości różnią się tylko ilością itów o wartości 0/1 w ostatnim loku, a schemat dopełnienia polegał na dołączaniu do oryginalnej wiadomości ciągu itów o wartości 0/1. Najpopularniejszy mechanizm dopełnienia polega na dołączeniu do wiadomości jednego itu o wartości 1 od strony najmniej znaczącego itu, następnie ciągu itów o wartości 0, a na koniec wartości określającej długość oryginalnej wiadomości, tak ay całość stanowiła wielokrotność wielkości loku, na którym funkcja skrótu operuje (rys. 2.8). Przykładowo dla funkcji operującej na 512-itowym loku wiadomości dołączamy it o wartości 1, następnie ciąg itów o wartości 0 tak, ay cała wiadomość miała długość 448 modulo 512. Następnie do tak skonstruowanej wiadomości jest dołączana 64-itowa wartość length określająca jej oryginalną długość modulo 2 64 (rys. 2.8). Metoda ta jest rekomendowana przez NIST [91,92] i używana w aktualnych funkcjach skrótu. Rys. 2.8 Metoda dopełnienia wiadomości według NIST. W 2005 roku Johnson [50] na warsztatach poświeconych funkcjom skrótu przeprowadzonych przez NIST przeanalizował uproszczoną metodę polegającą na opuszczeniu itu o wartości 1 i dołączaniu od razu ciągu itów o wartości 0. Technika ta yła używana między innymi w rosyjskim standardzie funkcji skrótu o nazwie GOST [41]. Tak jak poprzednio na końcu tak skonstruowanej wiadomości jest dołączana 64-itowa wartość length określająca jej oryginalną długość modulo 2 64. Metoda zaproponowana przez Johnsona (rys. 2.9) jest godna polecenia dla systemów zorientowanych na optymalizację oliczeń. 19
Rys. 2.9 Metoda dopełnienia wiadomości według Johnsona. Podsumowanie Metody dopełniania wiadomości nie mają istotnego wpływu na ezpieczeństwo funkcji skrótu. Ważnym aspektem jest tylko fakt umieszczania na końcu wiadomości jej oryginalnej długości. Utrudnia to znajdowanie kolizji z wykorzystaniem ataku wielolokowego dla wiadomości o różnych długościach. W projektowanej w niniejsze pracy funkcji skrótu zostanie wykorzystana uproszczona metoda dopełnienia wiadomości zaproponowana przez Johnsona, ze względu na zwiększenie prędkości działania funkcji skrótu dla wiadomości o pewnych długościach. Wartym zauważenia jest również fakt dołączania do oryginalnej wiadomości pewnego znacznika określającego instancję użytej funkcji w przypadku rodziny funkcji skrótu. Z sytuacją taką mamy do czynienia na przykład dla algorytmów HAVAL [141] oraz LAKE [5]. Ze względu na możliwość definiowania liczy rund oraz w celu jednoznacznej identyfikowalności użytej instancji funkcji skrótu, do algorytmu dopełniania wiadomości zostanie dołożona wartość określająca liczę rund użytych w funkcji PHAL-256. 2.5. STRUKTURY ITERACYJNE Od czasu, gdy w 1989 roku Merkle [74] i Damgård [27] niezależnie przedstawili iteracyjną strukturę konstrukcji funkcji skrótu, stała się ona najardziej popularnym i powszechnie stosowanym podejściem projektowym. Niestety ostatnie ataki pokazują słaości konstrukcji Merklego-Damgårda (MD) i jej podatność na atak wielolokowy. W niniejszym rozdziale zostanie szczegółowo pokazany schemat MD oraz inne interesujące podejścia do schematów iteracyjnych. Na drugich warsztatach dotyczących funkcji skrótu przeprowadzonych przez NIST w 2006 roku Rivest zaproponował nowe spojrzenie na konstruowanie funkcji skrótu. W wizji tej funkcja skrótu operuje jednocześnie na całej skracanej wiadomości, zamiast iteracyjnego skracania jej kolejnych loków. Jednak do tej pory żadna funkcja oparta na takim rozwiązaniu nie została zaprezentowana. Podejście to ze względu na liczne prolemy z analizowaniem całych wiadomości, często przecież ardzo dużych, nie wydaje się yć oiecujące. 20
MD Struktura Iteracyjna typu MD wynosi swoją nazwę od jej projektantów: Merklego i Damgårda. n Polega ona na konstruowaniu funkcji skrótu h : {0,1} * {0,1} za pomocą funkcji kompresującej ϕ o określonej długości wektora wejściowego ϕ n t : {0,1} {0,1} {0,1} n, gdzie t jest długością loku funkcji odpowiadającą wielkości loku skracanej wiadomości, natomiast n oznacza wielkość zmiennej łańcuchowej, odpowiadającej długości wektora inicjującego i najczęściej równej długości skrótu. Główną cechą konstrukcji MD jest fakt, iż jeśli funkcja kompresująca ϕ jest odporna na kolizje, to wynikowa funkcja skrótu h jest także odporna na kolizje. Specyfikacja funkcji opartej na schemacie MD musi zawierać w soie nie tylko opis funkcji kompresującej, ale także wartość wektora inicjującego IV oraz algorytm dopełnienia wiadomości. Algorytm wyznaczania skrótu dla wiadomości m dopełnionej i podzielonej na k loków równej długości przedstawia się następująco (rys. 2.10): CV CV 0 i + 1 = IV h( m) = CV = ϕ ( CV, m ), i = 0,1,..., k 1 k i i Rys. 2.10 Schemat struktury MD. Przez wiele lat społeczność kryptograficzna yła utwierdzona w przekonaniu, iż ezpieczeństwo schematu MD dotyczy również ataków na słaą ezkolizyjność (ang. second pre-image attacks). Jednak w 1999 roku Dean [30] zauważył, iż jeśli łatwo jest znaleźć punkty stałe (ang. fixed-points) dla funkcji kompresującej, wówczas atak na słaą ezkolizyjność wymaga złożoności oliczeniowej O(n 2 n/2 ) i pamięciowej O(n 2 n/2 ). W roku 2005 Kelsey i Schneier [56] przedstawiają ulepszoną wersję tego ataku. Pokazują, że jeśli mamy do czynienia z długą wiadomością, złożoną z 2 k loków, gdzie k jest liczą naturalną, to złożoność oliczeniowa ataku na słaą ezkolizyjność wynosi O(k 2 n/2+1 +2 n k+1 ). Dithering W 2005 roku Rivest [106] zaproponował pewną modyfikację metody MD. Polega ona na podaniu na wejście funkcji kompresującej dodatkowej nieperiodycznej wielkości d, stanowiącej niejako szum (ang. dither) (rys. 2.11). 21
Rys. 2.11 Schemat struktury z ditheringiem. Ważnym elementem tej struktury jest wymaganie na nieperiodyczność wartości d. Jedną z najprostszych propozycji jest użycie jako zmiennej d licznika generującego wartości d i = i. Niedogodnością takiego podejścia jest operowanie na ardzo długich wiadomościach. Należy zawczasu przygotować licznik o dużej liczie itów (np. 256), tak ay praktycznie niemożliwe yło jego przepełnienie. Innym pomysłem może yć zastosowanie pewnej sekwencji pseudolosowej p 0, p 1, p 2, o ardzo dużym okresie i użycie jej ezpośrednio jako zmiennej d, czyli d = p. Jednak podejście to z założenia nie jest wolne od powtórzeń. Rivest w swojej pracy jako zmienną d proponuje aelowe sekwencje z własnością niepowtarzalności podsłów (ang. aelian square-free sequences). Słowo d spełnia tę własność, jeśli nie może yć zapisane w postaci d = x y y z, gdzie x, y, z są słowami, y e, e jest słowem pustym i y jest permutacją y. W pracy [21] został przedstawiony atak na znalezienie drugiego przeciworazu o złożoności porównywalnej z atakami na strukturę typu MD. i i HAIFA W 2006 roku Biham i Dunkleman [13] przedstawili zupełnie nowe podejście do konstruowania iteracyjnych funkcji skrótu o nazwie HAIFA (HAsh Iterative FrAmework). Główną zmianą w stosunku do schematu MD jest wprowadzenie do algorytmu liczy itów (its), które już zostały skrócone oraz pewnej wartości losowej zwanej solą (salt). Funkcja kompresująca ϕ przyjmuje n t s postać ϕ : {0,1} {0,1} {0,1} {0,1} {0,1} n, gdzie dodatkowe zmienne i s oznaczają, odpowiednio, długości liczy itów pól dotychczas skróconych danych (#its) i wartości losowej (soli). Iteracyjny schemat algorytmu HAIFA przedstawia się następująco: CV CV 0 i+ 1 = IV h( m) = CV = ϕ ( CV, m,# its, salt), k i i i = 0,1,..., k 1 Licza itów dotychczas skróconych została wprowadzona celem zwiększenia odporności funkcji skrótu na atak z wykorzystaniem punktów stałych (ang. fix-points). Natomiast wartość losowa (sól) zwiększa odporność funkcji skrótu na ataki ogólne, gdzie często mamy do czynienia z wcześniej wygenerowanymi talicami (wiadomość i jej skrót). Talice takie w przypadku 22
stosowania soli musiałyy yć udowane dla każdej możliwej wartości parametru losowego (soli), co jest praktycznie niewykonalne. Podsumowanie Jak pokazują ostatnie ataki na funkcje skrótu, ardzo często atakowana jest nie sama funkcja kompresująca, lecz właśnie algorytm iteracyjny. Ponieważ większość współczesnych funkcji używa iteracyjnej struktury typu MD, więc stała się ona głównym celem ataków. Niestety ataki te onażyły niedoskonałości najpopularniejszej konstrukcji. Również pewne proste modyfikacje konstrukcji MD okazały się podatne na ataki [39]. Syntetyczne zestawienie struktur iteracyjnych (m.in. Enveloped MD, Randomized Hashing, ROX) oraz analizę ich odporności na kryptoanalizę można znaleźć w pracy [4]. Wydaje się, iż nowo tworzone funkcje skrótu, a zarazem funkcja tworzona w niniejszej pracy, powinny odejść od rozwiązania typu MD. Opracowując nowy schemat iteracyjny należy wziąć pod uwagę pewien element losowy, dzięki któremu można uchronić funkcję skrótu przed grupą ataków ogólnych z wcześniej przygotowanymi talicami. Natomiast w celu wykluczenia ataków za pomocą stałych punktów można wprowadzić do funkcji kompresującej pewien licznik, zmieniający się przy każdej iteracji. Oa podejścia zostaną wykorzystane w projektowanym algorytmie schematu iteracyjnego. 23
3. DEDYKOWANE FUNKCJE SKRÓTU 3.1. PRZEGLĄD WSPÓŁCZESNYCH FUNKCJI W celu przedstawienia metod konstrukcyjnych zastosowanych we współczesnych funkcjach skrótu przedstawione zostały funkcje wyrane: ze względu na swoją popularność (MD4, SHA), ze względu na zastosowanie loków podstawień w ich konstrukcji (TIGER), ze względu na rozwiązanie konstrukcyjne równoległość oliczeń (FORK-256). Intencją takiego wyoru yło w pierwszych dwóch przypadkach pokazanie słaości rodziny opartej na funkcji MD4, a w następnych przykładach pokazanie takich konstrukcji funkcji, które na dzień dzisiejszy są odporne na znane ataki. Konstrukcje te posłużyły za punkt odniesienia do projektowanej w niniejszej pracy funkcji skrótu. MD4 Funkcja skrótu MD4, która dała początek całej rodzinie MD/SHA została stworzona w roku 1990 przez Rona Rivesta [107] i yła na początku lat dziewięćdziesiątych najpopularniejszą funkcją skrótu. Została zaprojektowana z myślą o programowej implementacji na komputerach 32-itowych, a więc wszystkie operacje wykonywane są na zmiennych 32-itowych. Funkcja generuje skrót długości 128 itów, operując na 512-itowym loku wiadomości oraz na czterech zmiennych 32-itowych (A, B, C, D). Zmienne te są inicjowane wartościami: A 0 = 0x67452301, B 0 = 0xEFCDAB89, C 0 = 0x98BADCFE, D 0 = 0x10325476. Jest to funkcja o trzech rundach i 16 krokach w każdej rundzie (rys. 3.1). W każdej rundzie loki skracanej wiadomości podawane są w pewnej permutacji Σ r (m), dla 1 r 3, tak że do każdego kroku k wprowadzany jest lok wiadomości w k, dla 0 k 47 (ta. 3.1). Dodatkowo dokonywana jest rotacja w lewo o zmienną liczę itów s k (ta. 3.2). Funkcja kompresująca zastosowana w MD4 używa trzech stałych y 1, y 2, y 3 oraz trzech funkcji oolowskich f 1, f 2, f 3 odpowiednio dla każdej z rund: f ( x, y, z) = xy ( x) z, 1 f ( x, y, z) = xy xz yz, 2 f ( x, y, z) = x y z, 3 y y y 1 2 3 = 0x00000000, = 0x5A827999, = 0x6ED9EBA1. 24
Ta. 3.1 MD4 kolejność słów wiadomości skracanej w rundach. k w k Σ 1 (m) 0..15 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 Σ 2 (m) 16..31 0 4 8 12 1 5 9 13 2 6 10 14 3 7 11 15 Σ 3 (m) 32..47 0 8 4 12 2 10 6 14 1 9 5 13 3 11 7 15 Ta. 3.2 MD4 licza itów dla rotacji w lewo. k s k 0..15 3 7 11 19 3 7 11 19 3 7 11 19 3 7 11 19 16..31 3 5 9 13 3 5 9 13 3 5 9 13 3 5 9 13 32..47 3 9 11 15 3 9 11 15 3 9 11 15 3 9 11 15 Rys. 3.1 Schemat funkcji MD4. Pojedynczy krok loku kompresującego został przedstawiony poniżej (rys. 3.2). Łatwo zauważyć, iż trzy zmienne w pojedynczym kroku są po prostu kopiowane, natomiast modyfikowana jest tylko zawartość jednej zmiennej. Rys. 3.2 Krok loku kompresującego funkcji MD4. Bezpośrednią następczynią tej funkcji jest MD5, różniąca się od poprzedniczki następująco: stałe y 1, y 2, y 3 zostały zamienione na 64 wartości, różne dla każdego kroku algorytmu, 25
zmieniono kolejność słów wiadomości skracanej dla rundy drugiej i trzeciej, została dodana czwarta runda złożona także z 16 kroków, zmieniono liczę itów rotacji w lewo dla każdej rundy, funkcja f 2 została zamieniona na funkcję f ( x, y, z) = x xz yz 2, została dodana czwarta funkcja f ( x, y, z) = y ( x ), 4 z do wartości wyjścia danej rundy została dodana wartość wyjścia rundy poprzedniej. SHA Początek rodziny funkcji SHA datuje się na 1993 rok. Wówczas NSA poprzez NIST pulikuje pierwszą funkcję z tej rodziny nazywaną często SHA-0 [90]. Dwa lata później opulikowany zostaje algorytm SHA-1 [91], który zastępuje swojego poprzednika ze względu na nieujawnione oficjalnie wady. W 2001 roku NIST pulikuje ulepszoną wersję funkcji SHA dając jej rooczą nazwę SHA-2 [92]. W jej skład wchodzą cztery funkcje: SHA-224, SHA-256, SHA-384 i SHA- 512. Rok później rodzina ta staje się standardem opulikowanym jako FIPS PUB 180-2. Ze względu na złamanie funkcji SHA-0 oraz pewne słaości w SHA-1, NIST zaleca zaprzestanie używania funkcji SHA-1 w schematach podpisu cyfrowego i innych aplikacjach wymagających odporności na kolizje tak szyko jak to jest tylko możliwe. Amerykańskie agencje rządowe mają także wymóg przejścia na rodzinę funkcji SHA-2 od 2010 roku [88]. W roku 2007 NIST ogłosił konkurs na następcę standardu pod nazwą SHA-3 [87]. Poniżej została przedstawiona funkcja SHA-1 jako najczęściej używana funkcja skrótu w połowie lat dziewięćdziesiątych. Funkcja SHA-1 generuje skrót długości 160 itów, używając 5 zmiennych 32-itowych (A, B, C, D, E). Zmienne te są inicjowane wartościami: A 0 = 0x67452301, B 0 = 0xEFCDAB89, C 0 = 0x98BADCFE, D 0 = 0x10325476, E 0 = 0xC3D2E1F0. Skrót jest generowany po czterech 20-krokowych rundach (rys. 3.3). Każda runda używa pewnej funkcji oolowskiej i stałej, odpowiednio: f ( x, y, z) = xy ( x) z, 1 f ( x, y, z) = x y z, 2 f ( x, y, z) = xy xz yz, 3 f ( x, y, z) = x y z, 4 y y y y 1 2 3 4 = 0x5A827999, = 0x6ED9EBA1, = 0x8F1BBCDC, = 0xCA62C1D6. Stałe y 1, y 2, y 3, y 4 stanowią heksadecymalne wartości wyrażenia 32 s / 4) 2 dla { 2,3,5,10} ( s. 26
Rys. 3.3 Schemat funkcji SHA-1. Jeden lok wiadomości, składający się z szesnastu słów 32-itowych (m 0,,m 15 ), jest poddawany procesowi rozszerzania i zostaje przekształcony w osiemdziesiąt słów (w 0,,w 79 ) zgodnie z regułą: w i = m i, dla i = {0,.15}; w i = (w i 3 w i-8 w i-14 w i-16 ) 1, dla i = {16,.79}. Pojedynczy krok loku kompresującego został przedstawiony na poniższym rysunku (rys. 3.4). Podonie jak to miało miejsce w funkcji MD4 trzy zmienne są w pojedynczym kroku po prostu kopiowane. Jedna zmienna jest modyfikowana tylko za pomocą operacji przesunięcia cyklicznego w lewo. Ostatnia zmienna jest natomiast modyfikowany za pomocą funkcji oolowskiej f r, podloku wiadomości w k, stałej y r oraz przesunięcia itowego. Rys. 3.4 Krok loku kompresującego funkcji SHA-1. Funkcja SHA-1 generuje skrót długości 160 itów, używając na wyjściu konkatenacji 5 zmiennych 32-itowych (A, B, C, D, E). 27
Następczynią funkcji SHA-1 jest rodzina funkcji nazywana SHA-2. Funkcje z rodziny SHA-2 generują skróty o czterech możliwych długościach: 224, 256, 384 i 512 itów. Najardziej interesującymi zmianami w stosunku do poprzedniczki są (zmiany podano dla funkcji SHA-256): zamieniono wektor stanu 5 zmiennych 32-itowych (A, B, C, D, E) na 8 zmiennych 32-itowych (A, B, C, D, E, F, G, H), zamieniono cztery stałe y 1, y 2, y 3, y 4 (każda dla jednej rundy stanowiące wartości wyrażenia 32 s / 4) 2 dla s { 2,3,5,10} ( ) na 64 stałe (każda dla jednego kroku stanowiące pierwiastki sześcienne z pierwszych sześćdziesięciu czterech licz pierwszych), zmniejszono liczę kroków w rundzie (z 20 na 16), ale sumaryczna licza kroków pozostała ez zmian (80), w pojedynczej rundzie dwie wartości zmiennych wewnętrznych są modyfikowane, natomiast pozostałe sześć zmiennych wewnętrznych jest przepisywanych, zwiększono długość skrótu ze 160-itów na jedną z wartości: 224 lu 256 itów. TIGER Funkcja TIGER autorstwa Andersona i Bihama [3] została zaprojektowana w 1995 roku. Miała stanowić alternatywę dla rodziny MD/SHA i yć zoptymalizowana dla procesorów 64-itowych. W wyniku powstała funkcja równie szyka jak SHA-1 na procesorach 32-itowych i aż trzykrotnie szysza od niej na platformach 64-itowych. Funkcja kompresująca wykorzystuje w swojej strukturze loki podstawień (S-ox 1,, S-ox 4 ). Każdy z czterech statycznych loków podstawień przekształca 8 itów wejściowych w 64 ity wyjściowe. Funkcja w pełnej wersji generuje skrót o długości 192 itów, używając trzech 64-itowych zmiennych (A, B, C). Skrót jest generowany po trzech rundach algorytmu (rys. 3.5). Każda runda składa się z ośmiu kroków. Rys. 3.5 Schemat funkcji TIGER. Na wejście pierwszej rundy podawana jest oryginalna 512-itowa wiadomość m podzielona na osiem 64-itowych słów. Na wejście kolejnych rund podawana jest wiadomość m po przejściu złożonego algorytmu, nazwanego przez autorów KeySchedule. Nazwa nawiązuje do sposou generowania kluczy w szyfrach lokowych, gdyż, tak jak tam, proces ten jest dość złożony (alg. 3.1). 28
KeySchedule(m0,m1,,m7) { } m0 := m0 [m7 0xA5A5A5A5A5A5A5A5]; m1 := m1 m0; m2 := m2 + m1; m3 := m3 [m2 (( m1) «19)]; m4 := m4 m3; m5 := m5 + m4; m6 := m6 [m5 (( m4)» 23)]; m7 := m7 m6; m0 := m0 + m7; m1 := m1 [m0 (( m7) «19)]; m2 := m2 m1; m3 := m3 + m2; m4 := m4 [m3 (( m2)» 23)]; m5 := m5 m4; m6 := m6 + m5; m7 := m7 [m6 0x0123456789ABCDEF] Alg. 3.1 Algorytm KeySchedule dla funkcji TIGER. Słowa wiadomości m=(m 0, m 1,, m 7 ) podawane są do funkcji kroku zgodnie z zależnością: w i = m i, dla 0 i 7; (w 8, w 9,, w 15 ) = KeySchedule(w 0, w 1,, w 7 ); (w 16, w 17,, w 23 ) = KeySchedule(w 8, w 9,, w 15 ). Każda runda r używa też innego mnożnika y r, odpowiednio: y =, y = 7, y 9. 1 5 2 3 = Rys. 3.6 Krok loku kompresującego funkcji TIGER. Na wejście funkcji z lokami podstawień podawana jest zmienna C podzielona na osiem 8-itowych słów. Parzyste (even) słowa zmiennej C są podawane na kolejne loki podstawień w kolejności rosnącej, a następnie wynik działania jest dodawany do zmiennej B. Natomiast nieparzyste (odd) słowa podawane są w kolejności malejącej, a ich wynik odejmowany jest od 29