Inzynieria bezpieczenstwa - laboratorium nr 8

Transkrypt

Inzynieria bezpieczenstwa - laboratorium nr 8
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 M1 i M2, 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 2m losowych wiadomości. Natomiast znalezienie dwóch losowych wiadomości,
dla których wartości skrótu będą takie same, wynosi jedynie 2m/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 232 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 232 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 264 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
B
C
D
=
=
=
=
0x01234567
0x89ABCDEF
0xFEDCBA98
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 , Z ) = ( X ∧ Y ) ∨ (¬X ) ∧ Z
G ( X , Y , Z ) = ( X ∧ Z ) ∨ (Y ∧ (¬Z ))
H ( X ,Y , Z ) = X ⊕ Y ⊕ Z
I ( X , Y , Z ) = Y ⊕ ( X ∨ (¬Z ))
Funkcja F jest funkcją warunkową: jeśli X to Y, inaczej Z.
Funkcja H jest operatorem parzystości.
Jeśli Mi 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,Mj,s,t) oznacza a = b + ((a + F(b,c,d) + Mj + ti) <<< s)
GG(a,b,c,d,Mj,s,t) oznacza a = b + ((a + G(b,c,d) + Mj + ti) <<< s)
HH(a,b,c,d,Mj,s,t) oznacza a = b + ((a + H(b,c,d) + Mj + ti) <<< s)
II(a,b,c,d,Mj,s,t) oznacza a = b + ((a + I(b,c,d) + Mj + ti) <<< s)
-4-
Cztery cykle algorytmu (64 kroki) mogą być opisane następująco:
Cykl 1.
FF(a,b,c,d,M0,7,0xd76aa478)
FF(a,b,c,d,M1,12,0xe8c7b756)
FF(a,b,c,d,M2,17,0x242070db)
FF(a,b,c,d,M3,22,0xc1bdceee)
FF(a,b,c,d,M4,7,0xf57c0faf)
FF(a,b,c,d,M5,12,0x4787c62a)
FF(a,b,c,d,M6,17,0xa8304613)
FF(a,b,c,d,M7,22,0xfd469501)
FF(a,b,c,d,M8,7,0x698098d8)
FF(a,b,c,d,M9,12,0x8b44f7af)
FF(a,b,c,d,M10,17,0xffff5bb1)
FF(a,b,c,d,M11,22,0x895cd7be)
FF(a,b,c,d,M12,7,0x6b901122)
FF(a,b,c,d,M13,12,0xfd987193)
FF(a,b,c,d,M14,17,0xa679438e)
FF(b,c,d,a,M15,22,0x49b40821)
Cykl 2.
GG(a,b,c,d,M1,5,0xf61e2562)
GG(d,a,b,c,M6,9,0xc040b340)
GG(c,d,a,b,M11,14,0x265e5a51)
GG(b,c,d,a,M0,20,0xe9b6c7aa)
GG(a,b,c,d,M5,5,0xd62f105d)
GG(d,a,b,c,M10,9,0x2441453)
GG(c,d,a,b,M15,14,0xd8a1e681)
GG(b,c,d,a,M4,20,0xe7d3fbc8)
GG(a,b,c,d,M9,5,0x21e1cde6)
GG(d,a,b,c,M14,9,0xc33707d6)
GG(c,d,a,b,M3,14,0xf4d50d87)
GG(b,c,d,a,M8,20,0x455a14ed)
GG(a,b,c,d,M13,5,0xa9e3e905)
GG(d,a,b,c,M2,9,0xfcefa3f8)
GG(c,d,a,b,M7,14,0x676f02d9)
GG(b,c,d,a,M12,20,0x8d2a4c8a)
Cykl3.
HH(a,b,c,d,M5,4,0xfffa3942)
HH(d,a,b,c,M8,11,0x8771f681)
HH(c,d,a,b,M11,16,0x6d9d6122)
HH(b,c,d,a,M14,23,0xfde5380c)
HH(a,b,c,d,M1,4,0xa4beea44)
HH(d,a,b,c,M4,11,0x4bdecfa9)
HH(c,d,a,b,M7,16,0xf6bb4b60)
HH(b,c,d,a,M10,23,0xbebfbc70)
HH(a,b,c,d,M13,4,0x289b7ec6)
HH(d,a,b,c,M0,11,0xeaa127fa)
HH(c,d,a,b,M3,16,0xd4ef3085)
HH(b,c,d,a,M6,23,0x4881d05)
HH(a,b,c,d,M9,4,0xd9d4d039)
-5-
HH(d,a,b,c,M12,11,0xe6db99e5)
HH(c,d,a,b,M15,16,0x1fa27cf8)
HH(b,c,d,a,M2,23,0xc4ac5665)
Cykl4.
II(a,b,c,d,M0,6,0xf4292244)
II(d,a,b,c,M7,10,0x432aff97)
II(c,d,a,b,M14,15,0xab9423a7)
II(b,c,d,a,M5,21,0xfc93a039)
II(a,b,c,d,M12,6,0x655b59c3)
II(d,a,b,c,M3,10,0x8f0ccc92)
II(c,d,a,b,M10,15,0xffeff47d)
II(b,c,d,a,M1,21,0x85845dd1)
II(a,b,c,d,M8,6,0x6fa87e4f)
II(d,a,b,c,M15,10,0xfe2ce6e0)
II(c,d,a,b,M6,15,0xa3014314)
II(b,c,d,a,M13,21,0x4e0811a1)
II(a,b,c,d,M4,6,0xf7537e82)
II(d,a,b,c,M11,10,0xbd3af235)
II(c,d,a,b,M2,15,0x2ad7d2bb)
II(b,c,d,a,M9,21,0xeb86d391)
Występujące w powyŜszym wzorze stałe ti były wybierane wg następującej reguły:
w kroku i stała ti jest częścią całkowitą liczby 232 × |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:
f t ( X , Y , Z ) = ( X ∧ Y ) ∨ ((¬X ) ∧ Z )
dla t ∈< 0,19 >
ft ( X ,Y , Z ) = X ⊕ Y ⊕ Z
dla t ∈< 20,39 >
f t ( X , Y , Z ) = ( X ∧ Y ) ∨ ( X ∧ Z ) ∨ (Y ∧ Z )
dla t ∈< 40,59 >
ft ( X ,Y , Z ) = X ⊕ Y ⊕ Z
dla t ∈< 60,79 >
W algorytmie są teŜ stosowane cztery stałe:
Kt = 0x5a827999
dla t ∈< 0,19 >
Kt = 0x6ed9eba1
dla t ∈< 20,39 >
Kt = 0x8f1bbcdc
dla t ∈< 40,59 >
Kt = 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 232.
Jeden blok wiadomości, składający się z szesnastu 32-bitowych wartości (słowa od M0
do M15) jest przekształcany w osiemdziesiąt słów 32-bitowych (od W0 do W79)
przy zastosowaniu następującego algorytmu:
Wt = Mt
dla t ∈< 0,19 >
Wt = (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), Wt 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) + ft(b,c,d) + e + Wt + Kt
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
5.1.
5.2.
Zapoznać się z materiałami (takŜe pod kątem wejściówki)
Korzystając z materiałów, dokonać implementacji funkcji mieszających
MD5 oraz SHA-1
5.3. (*) Zaimplementować algorytmy SHA-256 oraz SHA-512.
6. Literatura
6.1.
6.2.
6.3.
6.4.
Schneier B. „Kryptografia dla praktyków”, WNT, Warszawa
Denning D.E.R. „Kryptografia i ochrona danych”, WNT, Warszawa 92
http://www.faqs.org/rfcs/rfc1321.html - dokument opisujący funkcję MD5
http://www.faqs.org/rfcs/rfc3174.html - dokument opisujący funkcję SHA-1
-9-