Inzynieria bezpieczenstwa
Transkrypt
Inzynieria bezpieczenstwa
Koncepcja systemu kryptograficznego z kluczem jawnym (zwanym inaczej systemem kryptograficznym z kluczem publicznym lub asymetrycznym systemem kryptograficznym) została po raz pierwszy zaprezentowana przez Diffiego i Hellmana w 1976 r. W systemie tego typu stosuje się dwa róŜne klucze: szyfrujący oraz deszyfrujący. Schemat blokowy algorytmu asymetrycznego przedstawia poniŜszy schemat: R y s u n e k 1 S c h e m a t b l o k o w y a l g o r y t m u a s y m e t r y c z n e g o Generator klucza kryptograficznego generuje dwa klucze: szyfrujący K1 oraz deszyfrujący K2. Klucz szyfrujący jest nazywany i przesyła się go do nadawcy informacji zwykłym, niezabezpieczonym kanałem transmisyjnym. KaŜdy nadawca informacji moŜe uŜyć tego klucza, obliczając: C = EK1 (M ) Algorytmy z kluczem publicznym są pomyślane tak, Ŝe odwrócenie operacji szyfrującej jest niemoŜliwe w rozsądnym czasie. Aby odczytać zaszyfrowaną wiadomość, naleŜy znać klucz K2, który jest nazywany i nie moŜna go otrzymać znając klucz jawny K1. Proces deszyfrowania określa zaleŜność: M = DK 2 (C ) Oba przekształcenia (E oraz D) muszą być operacjami jednoznacznie odwracalnymi. Systemy kryptograficzne z kluczem jawnym są inaczej zwane systemami asymetrycznymi, w odróŜnieniu od systemów symetrycznych, uŜywających jednego klucza zarówno do operacji szyfrowania, jak i deszyfrowania (do algrytmów symetrycznych naleŜy np. DES). k k l u c z e m t a j n y l u c z e m j a w n y m m Systemy kryptograficzne z kluczem jawnym opierają się na tzw. (z ang. trapdoor one-way functions). Obliczenie wartości takiej n i e o d w r a c a l n y c h f u n k c j a c h z a p a d k o w y c h -1- funkcji jest łatwe, ale odwrócenie operacji okazuje się być praktycznie niemoŜliwe. Algorytmy z kluczem jawnym są algorytmami blokowymi. Większość algorytmów z kluczem jawnym bazuje na jednym z trzech problemów trudnych, do których naleŜą: • Problem plecakowy; • Problem logarytmu dyskretnego; • Problem faktoryzacji. Siła dowolnego algorytmu z kluczem jawnym zaleŜy od złoŜoności obliczeniowej problemu, na którym algorytm ten bazuje. Pierwszy algorytm kryptograficzny z kluczem publicznym zaprojektowali w 1978 r. Merkle i Hellman. Zaproponowali oni szyfr, opierający się na problemie plecakowym, będącym zagadnieniem klasy NP-zupełnej. Pojęcie NP pochodzi z teorii złoŜoności, która umoŜliwia analizowanie złoŜoności obliczeniowej algorytmów kryptograficznych. Algorytmy klasyfikuje się w zaleŜności od ich złoŜoności czasowej lub przestrzennej, wyraŜonej jako funkcja argumentu n. Algorytm jest liniowy jeśli jego złoŜoność rośnie liniowo wraz ze wzrostem n; podobnie algorytmy mogą być kwadratowe, wykładnicze itp. Algorytmy z kluczem jawnym mają zwykle złoŜoność wykładniczą. Trudność obliczenia logarytmu dyskretnego wykorzystano m.in. w algorytmie ElGamala, a problem faktoryzacji w algorytmie RSA. Część bezpiecznych i praktycznych algorytmów asymetrycznych nadaje się tylko do szyfrowania danych, inne tylko do podpisów cyfrowych. Jedynie dwa algorytmy (RSA i ElGamal) mogą być uŜyte w obu tych zastosowaniach. Do podpisów cyfrowych uŜywany jest takŜe często algorytm DSA (ang. Digital Signature Algorithm). Wszystkie algorytmy z kluczem jawnym działają bardzo wolno w porównaniu do algorytmów symetrycznych. W algorytmie tym wykorzystano problem plecakowy, zwany inaczej problemem upakowania. Problem ten przedstawia się następująco: do dyspozycji mamy nieuporządkowany zbiór przedmiotów, kaŜdy o innej wadze. Z tego zbioru naleŜy wybrać podzbiór o zadanej z góry łącznej wadze. Sformułowanie problemu w dziedzinie liczb wygląda następująco: mamy dodatnią liczbę całkowitą s i dla danego ciągu a szukamy wektora dwójkowego m = (m1, m2, …, mn) spełniającego równanie: n s = ∑ ai mi i =1 Wartości mi naleŜą do zbioru {0,1} . Wartość 1 wskazuje, Ŝe dany element jest składnikiem sumy, a wartość 0 – Ŝe nie jest. Np. jeśli a = (1191, 171, 459, 4517, 2410, 197) a s = 3798, to moŜna znaleźć rozwiązanie s = 1191+2410+197. Wtedy m = (1, 0, 0, 0, 1, 1). Znalezienie właściwego podzbioru jest zagadnieniem trudnym, gdyŜ naleŜy przeszukać 2n moŜliwych podzbiorów i nie znaleziono dotychczas lepszego algorytmu, rozwiązującego ten problem. ZłoŜoność problemu opisuje funkcja wykładnicza. Dla n = 200 zadanie staje się nierozwiązywalne metodą ataku brutalnego, jeśli natomiast liczba n = 1000, to moŜliwych podzbiorów będzie 21000, przy czym liczba atomów we Wszechświecie szacowana jest na 2256. -2- Merkle i Hellman pokazali, Ŝe problem plecakowy o złoŜoności wykładniczej moŜna przekształcić w problem o złoŜoności liniowej. W tym celu generuje się dwa klucze: jawny, słuŜący do szyfrowania, oraz tajny, deszyfrujący. Deszyfrowanie z kluczem jawnym jest problemem o złoŜoności wykładniczej i złamanie szyfru staje się bardzo trudne. Gdy do deszyfrowania uŜywany jest klucz tajny, problem ma złoŜoność liniową, dzięki czemu jest łatwy do rozwiązania. PoniŜszy rysunek przedstawia schemat blokowy algorytmu Merklego – Hellmana: R y s u n e k 2 S c h e m a t b l o k o w y p o d p i s y w a n i a i n f o r m a c j i a l g o r y t m e m M e r k l e g o H e l l m a n a Klucz tajny generowany jest za pomocą generatora liczb losowych i zawiera ciąg liczb losowych K ' = (k1 ' , k 2 ' ,.., k n ' ) oraz liczbę pierwszą m i liczbę losową w. Elementy ciągu K’ są tak dobrane, aby kaŜdy element ciągu był większy od sumy elementów poprzedzających (ciąg taki nazywany jest ciągiem superrosnącym), natomiast liczba pierwsza m i liczba losowa w spełniając zaleŜności: n m > ∑ ki ' i =1 1< w < m -1 Dla liczby w oblicza się odwrotność w (mod m) za pomocą wzoru: w × w −1 mod m = 1 Elementy klucza jawnego K = (k1, k2, …, ki) są obliczane z ciągu K’ z zaleŜności: ki = ki '×w(mod m) Klucz jawny jest przesyłany do nadawcy informacji kanałem niezabezpieczonym. Klucz tajny musi pozostać u odbiorcy. Szyfr Merklego – Hellmana jest szyfrem blokowym, szyfrującym ciągi binarne. Ciąg m1, m2, … dzieli się na bloki M = (m1, m2, …, mn) zawierające po n bitów. Szyfrowanie bloków odbywa się z uŜyciem klucza jawnego K wg wzoru: C = ∑ ki × mi i -3- W procesie deszyfrowania wykorzystuje się klucz tajny K’. Najpierw obliczane jest C’: C ' = C × w −1 (mod m) Znając C’ i K’, moŜna wyznaczyć elementy wiadomości. Poprawność algorytmu Merklego – Hellmana moŜna sprawdzić, podstawiając wzory ki = ki '×w(mod m) oraz C = ∑ ki × mi do wzoru C ' = C × w −1 (mod m) : i n n ( ) C ' = w −1 ∑ k i × mi (mod m) = ∑ ki '×mi × w × w −1 (mod m) (mod m) i =1 i =1 Korzystając ze wzoru w × w −1 mod m = 1 , moŜna napisać, Ŝe: n C ' = ∑ ki '×mi (mod n) i =1 n PoniewaŜ m > ∑ ki ' , moŜna napisać: i =1 n C ' = ∑ ki '×mi i =1 Szyfr Merklego – Hellmana został złamany cztery lata po opublikowaniu. Okazało się, Ŝe na podstawie klucza jawnego moŜna znaleźć klucz, zbliŜony do klucza tajnego, który umoŜliwia zdeszyfrowanie zaszyfrowanych wiadomości. Oprócz szyfru Merklego – Hellmana opracowano takŜe inne szyfry plecakowe, które takŜe zostały złamane. Obecnie bezpieczną odmianą szyfrów plecakowych jest algorytm Chora – Rivesta, którego realizacja wymaga jednak tak duŜego nakładu obliczeniowego, Ŝe algorytm ten jest bardzo rzadko stosowany w praktyce. P r z y k ł a d d z i a ł a n i a a l g o r y t m u M e r k l e g o – H e l l m a n a . Dany jest ciąg binarny M = (1, 0, 0, 1, 1, 1, 0, 1). Dysponując wygenerowanymi elementami klucza tajnego K’ = (3, 5, 11, 21, 39, 77, 153, 311) oraz w = 167 i m = 673 sprawdzamy działanie algorytmu. Obliczamy w-1, korzystając z algorytmu Euklidesa. Najpierw wyznaczamy NWD(167, 673): 673 = 4×167+5 167 = 33×5+2 5 = 2×2+1 -1 Aby znaleźć w , naleŜy rozwiązać równanie: w −1 × 167 − t × 673 = 1 W celu przedstawienia liczby 1 jako liniowej kombinacji liczb 167 i 673, wykorzystujemy ciąg równości od ostatniej do pierwszej w algorytmie Euklidesa. W kaŜdym kroku zapisujemy liczbę 1 za pomocą wcześniejszych reszt, aŜ dojdziemy do samych liczb 167 i 673: 1 = 5–2×2 = 5–2(167–33×5) = 67×5–2×167 = 67(673–4×167)–2×167 = 67×673 - 270×167 Zmiana znaków w ostatniej części wyraŜenia wymaga dodania i odjęcia od tego wyraŜenia liczby równej 167×673. 1 = 67×673–167×673+673×167–270×167 = 403×167–100×673 Szukana odwrotność w-1 wynosi zatem 403. -4- Elementy klucza jawnego obliczamy wykorzystując klucz tajny i zaleŜność ki = ki '×w(mod m) . Kluczem jawnym będzie ciąg K = (501, 162, 491, 142, 456, 72, 650, 116). Kryptogram obliczamy ze wzoru C = ∑ ki × mi : i 8 C = ∑ ki × mi = 501 + 142 + 456 + 72 + 116 = 1287 i =1 W procesie deszyfrowania najpierw obliczamy C’ ze wzoru C ' = C × w −1 (mod m) : C ' = C × w −1 (mod m) = 1286 × 403(mod 673) = 451 Wykorzystując klucz K moŜna wyrazić liczbę C’ jako sumę elementów tego klucza. Biorąc elementy klucza od ostatniego do pierwszego stwierdzamy, Ŝe 451 jest sumą liczb 311, 77, 39, 21 i 3, co zapisać moŜna w postaci: 451 = 1×3+0×5+0×11+1×21+1×39+1×77+0×153+1×311 Zatem informacja, otrzymana w wyniku deszyfrowania, ma postać M = (1, 0, 0, 1, 1, 1, 0, 1). MoŜna stosować ten algorytm zarówno do szyfrowania danych, jak i podpisów cyfrowych. Moc algorytmu ElGamala wynika z trudności obliczania logarytmów dyskretnych. Problem ten moŜna sformułować w sposób następujący: jeśli p jest liczbą pierwszą, a g i m są liczbami całkowitymi, naleŜy znaleźć takie x, Ŝe g x = m mod p . Schemat algorytmu ElGamala, zastosowanego do podpisywania dokumentów: R y s u n e k 3 S c h e m a t b l o k o w y p o d p i s y w a n i a i n f o r m a c j i a l g o r y t m e m E l G a m a l a -5- Aby wygenerować parę kluczy, jawny i tajny, losujemy liczbę pierwszą p oraz dwie liczby g oraz x spełniające warunek g < p ∧ x < p . Następnie obliczamy: y = g x mod p Kluczem jawnym są liczby: p, g oraz y. Kluczem tajnym jest x. Liczby p i g mogą być wykorzystywane przez grupę uŜytkowników. W celu podpisania wiadomości m ∈{0, p − 1} nadawca losuje liczbę k względnie pierwszą z liczbą p-1 i oblicza: a = g k mod p Następnie oblicza on liczbę b z następującego równania: m = ( x × a + k × b ) mod( p − 1) Do rozwiązywania równania stosuje się rozszerzony algorytm Euklidesa, którego dokładny opis moŜna znaleźć np. w [6.2]. Podpis stanowi para liczb a i b. Liczba k musi być utrzymywana w tajemnicy, gdy Ŝ jest ona prywatnym kluczem podpisującego dokument. Odbiorca dokumentu weryfikuje poprawność podpisu, sprawdzając równość: ( y a × a b ) mod p = g m mod p Algorytm ElGamala moŜna stosować równieŜ do szyfrowania wiadomości m wyraŜonych w postaci liczb naleŜących do zbioru {0, p − 1} . Schemat blokowy algorytmu jest bardzo podobny do algorytmu podpisywania z rys. nr 3, z tym, Ŝe zamiast podpisywania i weryfikacji podpisu stosuje się operację szyfrowania i deszyfrowania. Szyfrogram złoŜony z liczb a i b obliczany jest z zaleŜności: a = g k mod p b = (m × y k ) mod p Do wyznaczenia postaci jawnej wiadomości m z kryptogramu stosuje się wyraŜenie: b m = x mod p a Odwrotność mod p obliczamy na podstawie funkcji Eulera (ze wzoru a −1 ≡ aϕ ( n ) −1 (mod n) ). Poprawność algorytmu wynika z przekształcenia: b m × y k m × g x× k = = = m mod p ax ax g k×x f P r z y k ł a d d z i a ł a n i a a l g o r y t m u E l G a m a l a d o p o d p i s ó w c y r o w y c h . Zakładamy p = 11, g = 2 oraz x = 8. Obliczamy y ze wzoru y = g x mod p : y = g x mod p = 28 mod11 = 3 Kluczem jawnym są liczby: p = 11, g = 2 i y = 3. Aby podpisać wiadomość m = 5, wybieramy liczbę k = 9 i sprawdzamy, Ŝe NWD(k, p-1) = NWD(9, 10) = 1. Obliczamy a ze wzoru a = g k mod p : a = g k mod p = 29 mod11 = 6 Oraz liczbę b z równania m = ( x × a + k × b ) mod( p − 1) : m = (x × a + k × b ) mod( p − 1) 5 = (8 × 6 + 9 × b ) mod(10), b = 3 -6- Liczbę b moŜna znaleźć numerycznie, rozwiązując równanie 8×6+9×b–10×x=5 w dziedzinie liczb całkowitych. Aby zweryfikować podpis, ( y a × a b ) mod p = g m mod p : naleŜy potwierdzić, Ŝe spełnione jest równanie (36 × 63 ) mod11 = 25 mod11 Algorytm Ronalda Rivesta, Adi Shamira i Leonarda Adelmana, zwany od nazwisk twórców algorytmem RSA, pojawił się wkrótce po opublikowaniu algorytmu Merklego – Hellmana. Algorytm ten nadaje się do szyfrowania danych i podpisów cyfrowych. Jest on algorytmem wykładniczym z kluczem publicznym. Bezpieczeństwo RSA opiera się na trudności faktoryzacji duŜych liczb. Schemat blokowy algorytmu: R y s u n e k 4 – S c h e m a t b l o k o w y s z y f r o w a n i a a l g o r y t m e m R S A Klucze tajny i jawny szyfru RSA są funkcjami pary duŜych liczb pierwszych. W celu wygenerowania kluczy odbiorca kryptogramu losuje dwie liczby pierwsze p i q oraz liczbę e. Iloczyn n = p×q oraz liczba e stanowią klucz publiczny, z tym, Ŝe liczba e musi być względnie pierwsza z funkcją Eulera ϕ (n) . Spełnione są więc zaleŜności: n = p×q ϕ (n) = ( p − 1)(q − 1) NWD (e, ϕ (n)) = 1 Kluczem tajnym, słuŜącym do deszyfrowania kryptogramu, są liczby d oraz n. Liczba d spełnia zaleŜność: e × d mod ϕ (n) = 1 Po obliczeniu kluczy liczby p oraz q naleŜy zniszczyć tak, aby nigdy nie zostały ujawnione. -7- W celu zaszyfrowania informacji, naleŜy przedstawić ją w postaci liczb z zakresu od 0 do n1. Elementy kryptogramu ci odpowiadające wiadomości mi oblicza się z zaleŜności: e ci = mi mod n Odszyfrowywanie przeprowadzane jest wg wzoru: d mi = ci mod n Wiadomość moŜna równieŜ zaszyfrować za pomocą klucza tajnego (liczby d), a odszyfrować za pomocą klucza jawnego (liczby e). Funkcję szyfrującą moŜna zrealizować za pomocą następującego algorytmu numerycznego: 1) Liczbę e przedstawiamy w postaci binarnej: e = ek , ek −1 ,..., e1 , e0 2) Podstawiamy ci = 1 3) Powtarzamy w pętli od 0 do k następujące operacje: 2 a. ci = ci mod n b. JeŜeli ei = 1, to ci = ci × m mod n Funkcja szyfrująca i deszyfrująca są wzajemnie odwrotne. Poprawność algorytmu moŜna e d pokazać, podstawiając wzór opisujący szyfrowanie ci = mi mod n do wzoru mi = ci mod n , otrzymując: e× d mi = mi mod n Ze wzoru e × d mod ϕ (n) = 1 wynika, Ŝe e × d = t × ϕ (n) + 1 dla pewnego t, będącego liczbą całkowitą, a zatem: mi t ×ϕ ( n ) +1 mod n = mi × mi t ×ϕ ( n ) ( mod n = mi × mi ϕ (n) ) t mod n mod n Wykorzystując uogólnienie Eulera małego twierdzenia Fermata ( aϕ ( n ) (mod n) ≡ 1 ), otrzymujemy: ed mi = mi mod n = mi mod n = mi Na bezpieczeństwo szyfru wpływa dobór liczb pierwszych p i q – powinny to być liczby o długości ponad 100 cyfr. W celu lepszego zabezpieczenia n przed rozkładem na czynniki pierwsze zaleca się, aby: • Liczby p i q róŜniły się o kilka cyfr; • Zarówno p–1 jak i q–1 miały duŜe czynniki pierwsze; • Wartość NWD(p–1, q–1) była niewielka. W realizacji praktycznej algorytmu występuje problem wyboru algorytmu generowania liczb pierwszych i realizacji funkcji szyfrującej. Do generowania duŜych liczb pierwszych nie nadaje się klasyczna metoda sita Eratostenesa [6.3], nie powinno się równieŜ uŜywać powszechnie znanych liczb pierwszych, takich, jak np. liczby pierwsze Fermata lub Mersenna. Liczb pierwszych dla celów kryptograficznych poszukuje się poprzez losowanie nieparzystych liczb, a następnie poddawania liczb tych tzw. testom pierwszości [6.3]. Jeśli wylosowana liczba przejdzie testy pomyślnie, to jest duŜa szansa, Ŝe jest ona liczbą pierwszą. Znanych jest klika testów pierwszości. Jeden z tych testów opiera się na małym twierdzeniu Fermata, które głosi, Ŝe liczba pierwsza p spełnia zaleŜność a p −1 mod p = 1 dla a całkowitych, niepodzielnych przez p. Na przykład dla p = 5 i a = 4 otrzymamy 4 4 = 256(mod 5) ≡ 1 . -8- Szyfr RSA został złamany w 1994 r. – odczytano wtedy wiadomość, zaszyfrowaną przez twórców RSA siedemnaście lat wcześniej. Przy łamaniu pracowało przez osiem miesięcy 600 osób na pięciu kontynentach, korzystając z Internetu. Mimo to algorytm RSA jest obecnie uwaŜany za bezpieczny, dla odpowiednio duŜej wielkości klucza (co oznacza stosowanie bardzo duŜych – nawet kilkusetcyfrowych – liczb pierwszych). P r z y k ł a d d z i a ł a n i a a l g o r y t m u R S A . Niech informacja mi = 3. Przyjąć, Ŝe p = 5, q = 7 i e = 11. Dla przyjętych wartości naleŜy obliczyć: n = p × q = 35 i ϕ (n) = ( p − 1) × (q − 1) = 24 . Obliczamy d, wykorzystując algorytm Euklidesa. Najpierw wyznaczamy NWD(11,24): 24 = 2×11+2 11 = 5×2+1 Aby znaleźć d, naleŜy rozwiązać równanie e × d mod ϕ (n) = 1 : 11 × d − t × 24 = 1 W celu przedstawienia liczby 1 jako liniowej kombinacji liczb 11 i 24 wykorzystujemy ciąg równości od ostatniej do pierwszej w algorytmie Euklidesa. W kaŜdym kroku zapisujemy liczbę 1 za pomocą wcześniejszych reszt, aŜ dojdziemy do samych liczb 11 i 24: 1 = 11–5×2 = 11–5×(24–2×11) = 11×11–5×24 Zatem szukana liczba d = 11. e Szyfrowanie informacji przeprowadza się wg wzoru ci = mi mod n : e ci = mi mod n = 311 mod 35 = 177147 mod 35 = 12 W celu przeprowadzenia operacji deszyfrowania kryptogramu naleŜy skorzystać ze wzoru d mi = ci mod n : d mi = ci mod n = 1211 mod 35 = 743008370688 mod 35 = 3 5.1.Zapoznać się z materiałami (pod kątem wejściówki) 5.2.Dokonać implementacji algorytmu RSA, uŜywając dowolnej biblioteki obsługującej operacje na duŜych liczbach (np. MIRACL http://indigo.ie/~mscott/). Implementacja powinna obsługiwać szyfrowanie oraz podpisywanie dowolnych plików. 6.1.Mochnacki W. „Kody korekcyjne i kryptografia”, Oficyna Wydawnicza Politechniki Wrocławskiej, Wrocław 1997 6.2.Denning D.E.R. „Kryptografia i ochrona danych”, WNT, Warszawa 1992 6.3.Schneier B. „Kryptografia dla praktyków”, WNT, Warszawa -9-