Kodowanie i kompresja Streszczenie Studia Licencjackie Wykład 14, 7.06.2005 1 Kryptografia: algorytmy asymetryczne (RSA) Niech E K (x) oznacza szyfrowanie wiadomości x kluczem K (E od encrypt, D K (x) oznacza deszyfrowanie kryptogramu x kluczem K. Własność RSA: Niech K 1, K 2 to para kluczy dla algorytmu RSA. Wówczas: D K1 (E K2 (x)) = D K2 (E K1 (x)). Powód: szyfrowanie i deszyfrowanie to ta sama operacja. Zastosowania: szyfrowanie; uwierzytelnianie; 1.1 Algorytm RSA Wybór kluczy 1. Losowy wybór (dużych) liczb pierwszych p i q. 2. Losowy wybór liczby e spełniającej warunek: e i (p 1)(q 1) są względnie pierwsze. 1
3. Wybór za pomocą algorytmu Euklidesa liczby d takiej, że e d = 1 mod (p 1)(q 1). 4. Wyznaczenie n = p q i usunięcie liczb p, q. 5. Niech para [e, n] to klucz publiczny, para [d, n] to klucz prywatny. Szyfrowanie Liczbę m < n szyfrujemy w następujący sposób: E [e,n] (m) = m e mod n. Deszyfrowanie Kryptogram c deszyfrujemy w następujący sposób: D [d,n] (c) = c d mod n. Uwaga: szyfrowana wiadomość m na nie więcej bitów niż n, podobnie jej zaszyfrowana postać E [e,n] (m). Narzędzia matematyczne potrzebne przy analizie własności RSA: Twierdzenie 1 (Eulera) Niech φ(n) oznacza liczbę liczb naturalnych mniejszych od n, które sa względnie pierwsze z n. Niech x < n takie, że x i n sa względnie pierwsze. Wówczas x φ(n) = 1 mod n. Wniosek 1 (Twierdzenie Fermata) Jeśli n jest liczba pierwsza, to x n 1 = 1 mod n 2
dla każdego x < n. Algorytm Euklidesa: Dane: liczby naturalne m > n. Wyniki: d =NWD(m, n) oraz s, t takie, że d = sm + tn. 1. a := m, a := n, s := 1, s := 0, t := 0, t := 1 2. Dopóki a 0, powtarzaj: 3. d := a q := a div a (a, a ) := (a, a qa ) (s, s ) := (s, s qs ) (t, t ) := (t, t qt ) Jak wykorzystać algorytm Euklidesa do wyznaczenia d: warunek e d = 1 mod (p 1)(q 1) jest równoważny znalezieniu całkowitych d, f takich, że e d + f (p 1)(q 1) = 1 = NWD(e, (p 1)(q 1)). Poprawność deszyfrowania: Twierdzenie 2 Niech [e, n], [d, n] to para kluczy RSA. Wówczas dla każdego m < n zachodzi: D [d,n] (E [e,n] (m)) = m. 3
Dowód. Jeśli NWD(m, n) = 1: D [d,n] (E [e,n] (m)) = D [d,n] (m e mod n) = m ed mod n. Z faktu, że e d = 1 mod (p 1)(q 1) uzyskujemy: e d = 1 + x(p 1)(q 1) = 1 + φ(n), dla pewnego naturalnego x. Stosując twierdzenie Eulera: Jeśli NWD(m, n) > 1: m ed = m (m φ(n) ) x = m mod n. ten przypadek ma bardzo małe prawdoodobieństwo; wystąpienie tego przypadku pozwala znaleźć p i q a tym samym d (na podstawie e i n): oznacza to złamanie kluczy; niemniej, również w tym przypadku deszyfrowanie da poprawny wynik (dowód w oparciu o twierdzenie Fermata i chińskie twierdzenie o resztach). Bezpieczeństwo i implementacja RSA: 1. podstawowa metoda łamania RSA: rozkład n na czynniki pierwsze (faktoryzacja); znane tylko algorytmy o złożoności wykładniczej, w praktyce pozwoliły złamać tylko klucze 512-bitowe; 4
2. generowanie losowych liczb pierwszych: możliwe dzięki dużej gęstości liczb pierwszych (frakcja 1/ ln n w przedziale [2, n]); 3. sprawdzanie pierwszości liczb: wydajne algorytmy probabilistyczne; algorytm deterministyczny o wielomianowym czasie działania. Uwaga: sprawdzanie pierwszości może wykluczyć pierwszość liczby, bez podania jej dzielników (p. faktoryzacja). Przyklad 1 daddg 1.2 Sprawdzanie pierwszości Uwagi: 1. Istnieje deterministyczny algorytm sprawdzający pierwszość w wielomianowym czasie (alg. Agrawal-Kayal- Saxena). 2. W praktyce najpopularniejsze są probabilistyczne testy pierwszości, np. (oparte na teście Fermata), test Solovaya- Strassena i test Millera-Rabina. Liczbę w nazywamy świadkiem pierwszości dla liczby n jeśli w < n oraz w n 1 = 1 mod n. Test Fermata (dla liczby n): 1. Powtarzamy k razy: 5
(a) Wybieramy losowo liczbę w taką, że w < n. Jeśli NWD(w, n) > 1, to n jest liczbą złożoną. (b) Jeśli w n 1 1 mod n, to n jest liczbą złożoną. 2. Jeśli żadna z k powyższych prób nie zakończyła się stwierdzeniem, że n jest liczbą złożoną, stwierdzamy, że n jest liczbą pierwszą. Lemat 1 Niech S będzie zbiorem liczb względnie pierwszych z n (i mniejszych od n). Wtedy albo każdy element S jest świadkiem pierwszości n albo co najwyżej połowa jest świadkami pierwszości S. Dowód: Niech w 1,..., w t będą wszystkimi świadkami pierwszości n. Załóżmy, że istnieje w S, który nie jest świadkiem pierwszości n. Niech u i = w i w dla i [1, t]. Pokażemy, że u i u j dla i j oraz u i nie jest świadkiem pierwszości dla każdego i, j [1, t]: u i u j : Załóżmy nie wprost, że u i = u j Zauważmy, że u i u j = w(w i w j ) = 0, czyli n dzieli u i u j. Skoro w S, czyli w jest względnie pierwszy z n, więc n dzieli w i w j. Ale n < w i w j < n, więc w i = w j sprzeczność. u n 1 i = (ww i ) n 1 = w n 1 w n 1 i = w n 1 1 mod n. 6
Wniosek 2 Jeśli n jest liczba złożona dla której istnieje w < n które nie jest świadkiem pierwszości n, to test Fermata zwraca dla n poprawna odpowiedź z prawdopodobieństwem 1 1/2 k. Jeśli n jest liczba pierwsza to test Fermata zawsze zwraca dla n poprawna odpowiedź. Problem: istnieją liczby złożone, dla których wszystkie liczby względnie pierwsze (i mniejsze) są świadkami pierwszości. Rozwiazanie: test Millera-Rabina dla liczby n. Niech n 1 = 2 t m, gdzie m jest liczbą nieparzystą. Powtarzamy k razy: 1. Wybieramy losowo a < n i wyznaczamy w = a m mod n. 2. Niech i będzie minimalną wartością taką, że w 2i 1 mod n lub i = t. 3. Jeśli w 2t 1 mod n lub w 2i 1 1 mod n, to stwierdzamy, że n jest liczbą złożoną. Jeśli żadna z k powyższych prób nie zakończyła się stwierdzeniem, że n jest liczbą złożoną, stwierdzamy, że n jest liczbą pierwszą. Twierdzenie 3 Dla każdej liczby pierwszej test Millera-Rabina zwraca poprawna odpowiedź. Dla każdej liczby złożonej test Millera-Rabina zwraca poprawna odpowiedź z prawdopodobieństwem co najmniej 1 (1/4) k. 7
1.3 Bezpieczeństwo RSA 1. Nie należy stosować dwóch lub więcej par kluczy z tą samą wartością n. 2. Łamanie RSA ma podobną trudność do zadania rozkładu liczb na czynniki pierwsze. 2 Jednokierunkowe funkcje haszujace Pożądane własności funkcji h: Jednokierunkowa: dla danego y praktycznie niemożliwe znalezienie x takiego, że h(x) = y; natomiast samo wyznaczanie wartości funkcji h jest łatwe (obliczeniowo). Słabo bezkonfliktowa: dla danego x niemożliwe (w praktyce) wyznaczenie x takiego, że h(x) = h(x ). Silnie bezkonfliktowa: praktycznie nie jest możliwe znalezienie x, x takich, że h(x) = h(x ). Dla zastosowań interesuje nas znalezienie takiej funkcji h (albo iteracyjnego zastosowania pewnej funkcji), która jest jednokierunkowa i bezkonfliktowa oraz przekształca ciągi (liczby) dowolnej długości w ciągi (liczby) o ustalonej długości: Zastosowania: przechowywanie haseł; h : {0, 1} {0, 1} k. 8
zabezpieczanie przed zmianami (MAC); odcisk palca. 3 Zastosowania Podpis elektroniczny, szybkie szyfrowanie, uwierzytelnianie, bezpieczna komunikacja,... 9