Podstawy. Jednokierunkowość, zastosowania. Spośród wszystkich elementarnych procedur kryptograficznych najbardziej elementarne są funkcje mieszające. Funkcji takich moŝna uŝyć do szyfrowania, potwierdzania toŝsamości, a takŝe w prostych schematach podpisu cyfrowego. Funkcje mieszające są inaczej nazywane funkcjami skrótu lub funkcjami haszującymi. Wynik działania funkcji mieszającej. Argumentem funkcji mieszającej H(M) jest wiadomość M, a jej wynik działania (noszący nazwę skrótu wiadomości) jest liczbą h o ustalonej długości: h = H(M) Właściwości funkcji mieszających: Mając dane M, łatwo jest obliczyć h. Mając dane h, bardzo trudno jest obliczyć M. Mając dane M, bardzo trudno jest znaleźć takie M, Ŝe H(M) = H(M ). Ze względu na własność drugą, funkcje mieszające są często nazywane jednokierunkowymi. Właściwość trzecia oznacza, Ŝe nawet niewielka zmiana danych wejściowych powoduje całkowitą zmianę ciągu wyjściowego. Tę właściwość nazywa się efektem lawinowym. Funkcja mieszające pobiera jako dane wejściowe dowolnej długości ciąg bitów, zwraca natomiast wynik o stałym rozmiarze. Typowym zastosowaniem funkcji mieszających są podpisy cyfrowe. Jeśli dana jest wiadomość M, moŝna ją podpisać bezpośrednio poprzez zaszyfrowanie z uŝyciem klucza prywatnego. JednakŜe operacje, związane z algorytmami z kluczem publicznym, są zwykle bardzo kosztowne obliczeniowo, dlatego teŝ zamiast podpisywać M zwykle stosuje się funkcję mieszającą H i skrót wiadomości H(M). Rozmiar wyniku funkcji h mieści się zwykle w przedziale 128 512 bitów, podczas gdy sama wiadomość moŝe być znacznie większa. Podpisywanie funkcji mieszającej jest zatem znacząco szybsze niŝ podpisywanie całej wiadomości. Aby taka konstrukcja była bezpieczna, niedopuszczalna jest moŝliwość skonstruowania dwóch takich wiadomości M 1 i M 2, dla których funkcja mieszająca zwróci tę samą wartość. Funkcje mieszające mają w kryptografii wiele zastosowań. MoŜna wykorzystać je jako generatory ciągów pseudolosowych (kluczy), tworzonych na podstawie tajnej danej znanej tylko zainteresowanym stronom. - 1 -
2. Odporność na kolizje W większości zastosowań funkcjom mieszającym stawia się dodatkowe wymaganie, nazywane odpornością na kolizje. Kolizję definiujemy jako znalezienie dwóch wiadomości losowych M i M, takich, Ŝe H(M) = H(M ). Jest to zadanie bardzo trudne, moŝna tu jednak zastosować tzw. paradoks urodzin. Paradoks urodzin jest typowym problemem statystycznym. Ile osób musi znaleźć się w jednym pokoju, aby były znaczące szanse, Ŝe znajdzie się tam osoba urodzona konkretnego dnia (np. 1 stycznia)? Odpowiedź wynosi: 253. Zadajemy więc kolejne pytanie: ile osób musi być w tym pokoju, aby uzyskać znaczącą szansę, Ŝe są tam co najmniej dwie osoby urodzone tego samego dnia? Odpowiedź jest zaskakująca: wystarczą 23 osoby (mając 23 osoby mamy nadal 253 róŝne pary ludzi). Poszukiwanie kogoś z określoną datą urodzin jest analogią do ataku, polegającego na tym, Ŝe atakujący posiada wiadomość M i szuka takiej wiadomości M, Ŝe H(M) = H(M ). Natomiast poszukiwanie dwóch ludzi z tą samą losową datą urodzin jest analogiczne do ataku, podanego na samej górze niniejszego paragrafu (znalezienie dwóch wiadomości losowych M i M, takich, Ŝe H(M) = H(M )). Taki atak nazywany jest atakiem urodzinowym. Przyjmujemy, Ŝe jednokierunkowa funkcja skrótu jest bezpieczna i najlepszym sposobem ataku na nią jest łamanie brutalne. Funkcja wytwarza m-bitowy ciąg wyjściowy, co oznacza, Ŝe znalezienie wiadomości, dla której skrót jest równy danej wartości, wymaga obliczenia skrótu dla 2 m losowych wiadomości. Natomiast znalezienie dwóch losowych wiadomości, dla których wartości skrótu będą takie same, wynosi jedynie 2 m/2. Oznacza to znaczne skrócenie czasu poszukiwań: maszyna, która wykonuje obliczenia skrótu dla miliona wiadomości na sekundę, będzie musiała pracować 600 000 lat, aby znaleźć wiadomość, której skrót jest zgodny z danym skrótem 64-bitowym. Ta sama maszyna moŝe znaleźć parę wiadomości o tej samej wartości skrótu w ciągu godziny! Oznacza to, Ŝe obawiając się ataku urodzinowego, naleŝy wybierać funkcję skrótu, oferującą skrót dwukrotnie dłuŝszy od tego, jaki jest potrzebny. MoŜna sobie wyobrazić róŝne scenariusze ataków, oparte na paradoksie urodzin. Na przykład: Osoba A przygotowuje dwie wersje umowy: jedną korzystną dla osoby B, drugą korzystną dla siebie. Osoba A dokonuje zmian w kaŝdym z dokumentów, obliczając za kaŝdym razem wartość funkcji mieszającej (zmiany to np. dostawienie dodatkowych spacji). Jedna zmiana w jednej linii dokumentu, liczącego 32 strony, daje 2 32 róŝnych dokumentów. Osoba A szuka dwóch jednakowych wartości w zbiorze skróconych wartości dwóch dokumentów (jeśli wartości funkcji mieszającej mają 64 bity, to moŝna znaleźć taką parę przeglądając 2 32 wersji kaŝdego dokumentu). Osoba A przekazuje do podpisania osobie B wersję umowy, korzystną dla osoby B. Podpisanie następuje poprzez zaszyfrowanie kluczem prywatnym wartości funkcji mieszającej umowy. Osoba A zamienia umowy, a przed sądem moŝe udowodnić, Ŝe osoba B podpisała niekorzystną dla siebie umowę. - 2 -
3. Długość wartości jednokierunkowej funkcji skrótu Wartości funkcji skrótu, będące liczbami 64-bitowymi, są zbyt krótkie, aby wytrzymać atak metodą dnia urodzin. Większość praktycznie stosowanych funkcji skrótu daje wynik co najmniej 128-bitowy (zaleca się uŝywanie funkcji dających znacznie dłuŝsze wartości), co oznacza, Ŝe atakujący musi obliczyć wartości funkcji skrótu dla 2 64 wiadomości. 4. Przegląd funkcji mieszających 4.1. Funkcja MD5 Funkcja MD5 (Message Digest) została opracowana przez Rona Rivesta. Wytwarza ona skrót 128-bitowy. Po przetworzeniu wstępnym algorytm MD5 przetwarza tekst wejściowy w blokach o długości 512 bitów, podzielonych na 16 podbloków o długości 32 bity kaŝdy. Na wyjściu algorytmu otrzymujemy zbiór czterech bloków 32-bitowych, które po konkatenacji tworzą skrót 128-bitowy. Na początku wiadomość jest uzupełniana ciągiem binarnym tak, Ŝeby jej całkowita długość była o 64 bity krótsza od wielokrotności liczby 512. Ciąg uzupełniający składa się z pojedynczej jedynki, dołączanej do końca wiadomości, oraz takiej liczby zer, jaka będzie konieczna. Następnie do tak otrzymanego ciągu jest dołączany 64-bitowy ciąg, stanowiący zapis długości wiadomości (sprzed dołączenia ciągu uzupełniającego). Te dwa kroki słuŝą do uzyskania długości wiadomości będącej wielokrotnością liczby 512 i zapewniają jednocześnie, Ŝe róŝne wiadomości nie będą miały tej samej postaci po dodaniu ciągu uzupełniającego. Wartości początkowe czterech 32-bitowych zmiennych: A = 0x01234567 B = 0x89ABCDEF C = 0xFEDCBA98 D = 0x76543210 Zmienne te nazywane są zmiennymi łańcuchowymi (ang. chaining variables). Główna pętla algorytmu realizowana jest dla tylu 512- bitowych bloków, ile zawiera ich wiadomość. Cztery zmienne są kopiowane na inne cztery zmienne: A na a, B na b, C na c i D na d. Pętla główna składa się z czterech cykli, które są bardzo podobne. KaŜdy cykl składa się z 16 operacji, a w kaŝdej operacji jest obliczana funkcja nieliniowa trzech z czterech zmiennych a, b, c i d. Następnie do wyniku dodawana jest wartość pozostałej, czwartej zmiennej, pewien podblok wiadomości i pewna stała. Wynik jest przesuwany cyklicznie w prawo o zmienną liczbę bitów, a potem sumowany z jedną ze zmiennych a, b, c lub d. Ostatecznie wyniki jest przypisywany jednej ze zmiennych a, b, c lub d. - 3 -
Rysunek 1 - Podstawowa pętla MD5 Rysunek 2 - Jedna operacja MD5 W algorytmie występują cztery funkcje nieliniowe, po jednej na kaŝdy cykl (i róŝne dla kaŝdego cyklu): F( X, Y, = ( X Y ) ( X ) Z G ( X, Y, = ( X Z ) ( Y ( ) H ( X, Y, = X Y Z I ( X, Y, = Y ( X ( Z )) Funkcja F jest funkcją warunkową: jeśli X to Y, inaczej Z. Funkcja H jest operatorem parzystości. Jeśli M i reprezentuje podblok j (od 0 do 15) wiadomości, a <<< s oznacza przesunięcie w lewo o s bitów, to następujące cztery operacje są określone wzorami: FF(a,b,c,d,M j,s,t) oznacza a = b + ((a + F(b,c,d) + Mj + t i ) <<< s) GG(a,b,c,d,M j,s,t) oznacza a = b + ((a + G(b,c,d) + Mj + t i ) <<< s) HH(a,b,c,d,M j,s,t) oznacza a = b + ((a + H(b,c,d) + Mj + t i ) <<< s) II(a,b,c,d,M j,s,t) oznacza a = b + ((a + I(b,c,d) + Mj + t i ) <<< s) - 4 -
Cztery cykle algorytmu (64 kroki) mogą być opisane następująco: Cykl 1. FF(a,b,c,d,M 0,7,0xd76aa478) FF(a,b,c,d,M 1,12,0xe8c7b756) FF(a,b,c,d,M 2,17,0x242070db) FF(a,b,c,d,M 3,22,0xc1bdceee) FF(a,b,c,d,M 4,7,0xf57c0faf) FF(a,b,c,d,M 5,12,0x4787c62a) FF(a,b,c,d,M 6,17,0xa8304613) FF(a,b,c,d,M 7,22,0xfd469501) FF(a,b,c,d,M 8,7,0x698098d8) FF(a,b,c,d,M 9,12,0x8b44f7af) FF(a,b,c,d,M 10,17,0xffff5bb1) FF(a,b,c,d,M 11,22,0x895cd7be) FF(a,b,c,d,M 12,7,0x6b901122) FF(a,b,c,d,M 13,12,0xfd987193) FF(a,b,c,d,M 14,17,0xa679438e) FF(b,c,d,a,M 15,22,0x49b40821) Cykl 2. GG(a,b,c,d,M 1,5,0xf61e2562) GG(d,a,b,c,M 6,9,0xc040b340) GG(c,d,a,b,M 11,14,0x265e5a51) GG(b,c,d,a,M 0,20,0xe9b6c7aa) GG(a,b,c,d,M 5,5,0xd62f105d) GG(d,a,b,c,M 10,9,0x2441453) GG(c,d,a,b,M 15,14,0xd8a1e681) GG(b,c,d,a,M 4,20,0xe7d3fbc8) GG(a,b,c,d,M 9,5,0x21e1cde6) GG(d,a,b,c,M 14,9,0xc33707d6) GG(c,d,a,b,M 3,14,0xf4d50d87) GG(b,c,d,a,M 8,20,0x455a14ed) GG(a,b,c,d,M 13,5,0xa9e3e905) GG(d,a,b,c,M 2,9,0xfcefa3f8) GG(c,d,a,b,M 7,14,0x676f02d9) GG(b,c,d,a,M 12,20,0x8d2a4c8a) Cykl3. HH(a,b,c,d,M 5,4,0xfffa3942) HH(d,a,b,c,M 8,11,0x8771f681) HH(c,d,a,b,M 11,16,0x6d9d6122) HH(b,c,d,a,M 14,23,0xfde5380c) HH(a,b,c,d,M 1,4,0xa4beea44) HH(d,a,b,c,M 4,11,0x4bdecfa9) HH(c,d,a,b,M 7,16,0xf6bb4b60) HH(b,c,d,a,M 10,23,0xbebfbc70) HH(a,b,c,d,M 13,4,0x289b7ec6) HH(d,a,b,c,M 0,11,0xeaa127fa) HH(c,d,a,b,M 3,16,0xd4ef3085) HH(b,c,d,a,M 6,23,0x4881d05) HH(a,b,c,d,M 9,4,0xd9d4d039) - 5 -
HH(d,a,b,c,M 12,11,0xe6db99e5) HH(c,d,a,b,M 15,16,0x1fa27cf8) HH(b,c,d,a,M 2,23,0xc4ac5665) Cykl4. II(a,b,c,d,M 0,6,0xf4292244) II(d,a,b,c,M 7,10,0x432aff97) II(c,d,a,b,M 14,15,0xab9423a7) II(b,c,d,a,M 5,21,0xfc93a039) II(a,b,c,d,M 12,6,0x655b59c3) II(d,a,b,c,M 3,10,0x8f0ccc92) II(c,d,a,b,M 10,15,0xffeff47d) II(b,c,d,a,M 1,21,0x85845dd1) II(a,b,c,d,M 8,6,0x6fa87e4f) II(d,a,b,c,M 15,10,0xfe2ce6e0) II(c,d,a,b,M 6,15,0xa3014314) II(b,c,d,a,M 13,21,0x4e0811a1) II(a,b,c,d,M 4,6,0xf7537e82) II(d,a,b,c,M 11,10,0xbd3af235) II(c,d,a,b,M 2,15,0x2ad7d2bb) II(b,c,d,a,M 9,21,0xeb86d391) Występujące w powyŝszym wzorze stałe t i były wybierane wg następującej reguły: w kroku i stała t i jest częścią całkowitą liczby 2 32 sin(i), przy czym i jest podane w radianach. Po zakończeniu powyŝszych operacji do wartości zmiennych a, b, c i d są dodawane odpowiednio wartości zmiennych A, B, C i D, a potem algorytm rozpoczyna przetwarzanie następnego bloku wiadomości. Wartością wyjściową jest konkatenacja wartości zmiennych A, B, C i D. 4.2. Funkcja SHA-1 SHA oznacza Secure Hash Algorithm. Wytwarza skrót o długości 160 bitów. Długość wiadomości musi być wielokrotnością 512 uzupełnienie jest identyczne, jak w przypadku MD5 (opis w pkt. 4.1). Pięć 32-bitowych zmiennych jest inicjowanych następująco: A = 0x67452301 B = 0xefcdab89 C = 0x98badcfe D = 0x10325476 E = 0xc3d2e1f0 Następnie rozpoczyna się główna pętla algorytmu. W pętli tej przetwarzany jest kaŝdorazowo 512-bitowy blok wiadomości i proces ten jest powtarzany tyle razy, ile bloków ma wiadomość. Najpierw wartości zmiennych A, B, C, D i E są kopiowane na wartości innych zmiennych, oznaczonych odpowiednio a, b, c, d i e. - 6 -
Główna pętla składa się z czterech cykli, z których kaŝdy zawiera 20 operacji (MD5 miał cztery cykle po 16 operacji). KaŜda operacja składa się z nieliniowej operacji na trzech spośród czterech zmiennych a, b, c i d oraz przesunięcia i sumowania, podobnie jak w przypadku MD5. Zbiór nieliniowych funkcji SHA jest następujący: ( X, Y, = ( X Y) (( X ) dla t < 0, 19> f t f t f t f t ( X, Y, = X Y Z dla t < 20, 39> ( X, Y, = ( X Y) ( X ( Y dla t < 40, 59> ( X, Y, = X Y Z dla t < 60, 79> W algorytmie są teŝ stosowane cztery stałe: K t = 0x5a827999 dla t < 0, 19> K t = 0x6ed9eba1 dla t < 20, 39> K t = 0x8f1bbcdc dla t < 40, 59> K t = 0xca62c1d6 dla t < 60, 79> Źródło tych liczb jest następujące: 0x5a827999 = 2 ½ /4, 0x6ed9eba1 = 3 ½ /4, 0x8f1bbcdc = 5 ½ /4, 0xca62c1d6 = 10 ½ /4 i kaŝda z tych wartości mnoŝona jest razy 2 32. Jeden blok wiadomości, składający się z szesnastu 32-bitowych wartości (słowa od M 0 do M 15 ) jest przekształcany w osiemdziesiąt słów 32-bitowych (od W 0 do W 79 ) przy zastosowaniu następującego algorytmu: W t = M t dla t < 0, 19> W t = ( Wt 3 Wt 8 Wt 14 Wt 16) <<< 1 dla t < 16, 79> Jako ciekawostkę warto wspomnieć fakt, Ŝe pierwotna specyfikacja algorytmu SHA nie zawierała przesunięcia cyklicznego w lewo. Zmiana ta została wprowadzona w celu lepszego zabezpieczenia algorytmu przed atakami. Jeśli t oznacza nr operacji (od 0 do 79), W t reprezentuje podblok wiadomości o numerze t, a <<< s oznacza cykliczne przesunięcie w lewo o s bitów, to główna pętla algorytmu moŝe być przedstawiona następująco: For t = 0 to 79 do Tmp = (a <<< 5) + f t (b,c,d) + e + W t + K t e = d d = c c = b <<< 30 b = a a = Tmp - 7 -
Rysunek 3 - Jedna operacja algorytmu SHA-1 PowyŜszy rysunek ilustruje jeden cykl. Przesuwanie zmiennych realizuje to samo zadanie, które w MD5 było realizowane przez stosowanie róŝnych zmiennych w róŝnych miejscach. Po wykonaniu wszystkich działań zmienne a, b, c, d i e są dodawane odpowiednio do zmiennych A, B, C, D i E, a algorytm jest kontynuowany dla następnego bloku wiadomości. Ostatecznym wyjściem algorytmu jest konkatenacja zmiennych A, B, C, D oraz E. 4.3. Inne funkcje mieszające Istnieje znacznie więcej funkcji mieszających. Większość z nich albo została juŝ przeanalizowana, w wyniku czego stwierdzono, Ŝe nie są one bezpieczne i moŝna je złamać (np. MD4), albo teŝ nie zostały jeszcze przeprowadzone dokładne badania. Dodatkowo opisane funkcje mieszające (MD5 i SHA-1) niestety nie zapewniają juŝ odpowiedniego poziomu bezpieczeństwa ze względu na zbyt krótką wartość skrótu (zwłaszcza, gdy weźmie się pod uwagę atak urodzinowy). Ma to znaczenie zwłaszcza przy uŝywaniu nowych algorytmów szyfrów blokowych, takich, jak AES (z kluczem 256-bitowym). Wychodząc naprzeciw oczekiwaniom, zostały opublikowane specyfikacje nowych funkcji z rodziny SHA: SHA-256, SHA-384 i SHA-512, przeznaczone do współpracy z algorytmami blokowymi z kluczem o długości odpowiednio 128, 192 i 256 bitów. - 8 -
5. Zadania Korzystając z materiałów, dokonać implementacji funkcji mieszających MD5 oraz SHA-1 6. Literatura 6.1. Schneier B. Kryptografia dla praktyków, WNT, Warszawa 6.2. Denning D.E.R. Kryptografia i ochrona danych, WNT, Warszawa 92 6.3. http://www.faqs.org/rfcs/rfc1321.html - dokument opisujący funkcję MD5 6.4. http://www.faqs.org/rfcs/rfc3174.html - dokument opisujący funkcję SHA-1-9 -