| | Temat wykladu: |
| | Kryptografia: Asymetryczne algorytmy szyfrowania (by jaboja, 2007-07-30) @ wyklady.net |
| | Komentarze: http://forum.wyklady.net/index.php?topic=115.0 |
20:38 | JaBoJa | Witam |
20:39 | JaBoJa | Dzisiejszy wyklad poswiecony bedzie niesymetrycznym algorytmom szyfrowania |
20:40 | JaBoJa | Zacznijmy od tego czym wogole sa algorytmy niesymetryczne |
20:40 | JaBoJa | Z pewnoscia znacie szyfrowanie symetryczne, to znaczy z tym samym kluczem uzywanym zarowno do szyfrowania jak i do deszyfrowania |
20:41 | JaBoJa | Chociazby prosty XOR, czy jego tekstowa wersja czyli kod Vigeneree'a |
20:41 | JaBoJa | Ten sam klucz sluzy tam do zaszyfrowania wiadomosci i do jej pozniejszego odkodowania |
20:42 | JaBoJa | Natomiast w algorytmach niesymetrycznych klucze te sa rozne |
20:42 | JaBoJa | W wiekszosci wypadkow dodatkowo nie da sie uzyskac pierwszego znajac drugi et vice versa |
20:42 | JaBoJa | (acz sa wyjatki) |
20:43 | JaBoJa | Co w ten sposob uzyskujemy? |
20:43 | JaBoJa | Mozemy opublikowac jeden klucz np. w internecie (tzw. klucz publiczny) |
20:43 | JaBoJa | i jesli ktos chce nam rpzyslac wiadomosc przeznaczona tylko dla naszych oczu to uzyje go do szyfrowania |
20:44 | JaBoJa | Odszyfrowac mozna ja bedzie tylko tym drugim kluczem (tzw. klucz prywatny), wiec tylko my ja przeczytamy |
20:44 | JaBoJa | Co jednak wazne mozna ten proces odwrocic uzyskujac tym samym podpis elektroniczny |
20:44 | JaBoJa | Podpis dziala nastepujaco: |
20:45 | JaBoJa | Szyfrujemy wiadomosc swoim kluczem prywatnym, a odbiorca dekoduje ja naszym kluczem publicznym |
20:46 | JaBoJa | W ten sposob ma on pewnosc ze to my jestesmy autorem, bo tylko my znamy nasz klucz prywatny |
20:46 | JaBoJa | Tu jednak pojawia sie pewien problem. Spojrzmy na nastepujaca sytuacje: |
20:47 | JaBoJa | Szyfrujemy wiadomosc swoim kluczem prywatnym i dolaczamy do tekstu zaszyfrowanego kluczem publicznym odbiorcy jako podpis. |
20:48 | JaBoJa | Stwarza to mozliwosc zlamania kodu |
20:48 | JaBoJa | Wyglada to nastepujaco: |
20:50 | JaBoJa | napastnik moze tak spreparowac wiadomosc zeby zmusic nas do jej nieswiadomego odszyfrowania gdy bedziemy tworzyc podpis |
20:50 | JaBoJa | dzieje sie tak jesli uzyjemy dodatkowo potwierdzenia odbioru poprzez odeslanie wiadomosci nadawcy |
20:52 | JaBoJa | dlatego tez o wiele lepszym rozwiazeniem jest podpisywanie nie z uzyciem calej wiadomosci, ale jej skrotu |
20:52 | JaBoJa | (na przyklad wygenerowanego algorytmem MD5) |
20:53 | JaBoJa | Tak wiec schemat kozystania z algorytmu niesymetrycznego powinien byc nastepujacy: |
20:53 | JaBoJa | 1. Obliczamy skrot (np. MD5) wiadomosci |
20:54 | JaBoJa | 2. Szyfrujemy go swoim kluczem prywatnym |
20:54 | JaBoJa | 3. Dolaczamy go do wiadomosci i szyfrujemy calosc kluczem publicznym odbiorcy |
20:54 | JaBoJa | 4. Odbiorca deszyfruje wiadomosc swoim kluczem prywatnym |
20:55 | JaBoJa | 5. Odbiorca deszyfruje podpis naszym kluczem publicznym i porownuje go z podpisem wygenerowanym samodzielnie ta sama funkcja skrotu |
20:56 | JaBoJa | Z algorytmami niesymetrycznymi wiaze sie jednak jeszcze problem innego rodzaju, dodatkowo komplikujacy rzeczywiste implementacje |
20:56 | JaBoJa | Sa one o wiele wolniejsze od symetrycznych |
20:57 | JaBoJa | Na przyklad niesymetryczny algorytm RSA jest 1000 razy wolniejszy od symetrycznego DES |
20:57 | JaBoJa | Z tego tez powodu dobrym rozwiazaniem jest stosowanie systemow hybrydowych stosujacych oba typy algorytmow |
20:58 | JaBoJa | Klucz algorytmu symetrycznego (np. DES) jest generowany losowo, a nastepnie szyfrowany algorytmem niesymetrycznym. |
20:58 | JaBoJa | Odbiorca odkodowuje swoim kluczem prywatnym nie wiadomosc, ale zaszyfrowany klucz, ktory dopiero sluzy do odczytania wiadomosci. |
20:59 | JaBoJa | Pojawia sie tu jednak kolejny problem: klucz musi byc na tyle dlugi, aby nie mozna bylo go odgadnac metoda brute-force |
21:02 | JaBoJa | jesli jest za krotki to znajac klucz publiczny mozemy sobie bez problemu zakodowac dowolny klucz do algorytmu symetrycznego |
21:02 | JaBoJa | i gdyby udalo nam sie zaszyfrowac tak wszystkie mozliwe klucze |
21:02 | JaBoJa | to mogli bysmy znalesc ten wlasciwy |
21:02 | JaBoJa | nawet jesli znalezienie klucza prywatnego algorytmu niesymetrycznego jest niewykonalne |
21:04 | JaBoJa | Oczywiscie to samo moze nas spotkac jesli zaszyfrujemy bezposrednio wiadomosc algorytmem niesymetrycznym (np. RSA): jesli bedzie za krotka to mozna probowac szyfrowac wszystkie mozliwe wiadomosci sprawdzajac ktora bedzie pasowac do tej ktora przechwycilismy |
21:04 | JaBoJa | wtedy wystarczy dolozyc na koncu wiadomosci jakas duza liczbe losowa |
21:05 | JaBoJa | I moze jeszcze jedna uwaga nim przejde do opisu algorytmu RSA: |
21:05 | JaBoJa | Liczby losowe |
21:05 | JaBoJa | nie wolno ich napewno generowac systemowym generatorem pseudolosowym |
21:07 | JaBoJa | Generatory losowe nie sa sprawa az tak prosta, wiec i tak musimy znalesc jakis skuteczny generator pseudolosowy, ale nalezy pamietac ze jesli bedzie zbyt przewidywalny to przewidywanie jego dzialania moze posluzyc zlamaniu kodu. |
21:07 | JaBoJa | Generatorm pseudolosowym nie bede dzis poswiecal zbyt duzo czasu, natomiast pochwale sie ze mam generator losowy zbudowany w oparciu o wzmacniacz szumow tranzystora. |
21:08 | JaBoJa | Dla zainteresowanych moge podac schemat budowy. |
21:08 | JaBoJa | http://www.edw.com.pl/pdf/k04/43_10.pdf |
21:09 | JaBoJa | Problematyczne moze byc natomiast podlaczenie go do komputera, ale to juz nie temat tego wykladu. |
21:10 | JaBoJa | Przejdzmy teraz do algorytmu RSA |
21:11 | JaBoJa | notabene: jest on opatentowany w USA, nie wiem jak tu wyglada kwestia prawna, ale wydaje mi sie ze nas w Polsce ten patent nie dotyczy (jak ktos chce sprawdzic to niech we wlasnym zakresie poszuka w Google). |
21:12 | JaBoJa | bezpieczenstwo algorytmu RSA wynika z trudnosci w rozkladzie na czynniki pierwsze duzych liczb |
21:12 | JaBoJa | Zacznijmy jednak od sposobu generowania kluczy (rzecz opisywana w niemal wszystkich ksiazkach): |
21:14 | JaBoJa | [ baiji mi dal wlasnie znac na priv, ze patent na RSA wygasl w 2000 roku ] |
21:15 | JaBoJa | generujemy losowo dwie duze liczby pierwsze p i q |
21:16 | JaBoJa | duze to np. 200cyfr (albo i wiecej) |
21:16 | JaBoJa | obliczmy: n=p*q |
21:17 | JaBoJa | wazna uwaga: mimo ze teoretycznie znajac n znamy p i q to obliczenie tego jest niewykonalne w rozsadnym czasie |
21:17 | JaBoJa | nastepnie musimy wygenerowac liczbe losowa e, taka aby byla wzglednie pierwsza z liczba (p-1)(q-1) |
21:18 | JaBoJa | dla przyspieszenia calego algorytmu warto wziasc e=3 albo e=65537 |
21:19 | JaBoJa | maja one malo jedynek w zapisie binarnym i latwo jest wykonywac z ich uzyciem pozniejsze obliczenia |
21:20 | JaBoJa | nastepnie musimy znalesc liczbe d, taka ze e*d w dzieleniu przez (p-1)(q-1) daja reszte 1 |
21:21 | JaBoJa | kluczem publicznym algorytmu RSA jest para (n, e), a prywatnym para (n, d) |
21:21 | JaBoJa | mozna je zamienic miejscami, to ktora liczba jest ktorym kluczem nie ma znaczenia |
21:22 | JaBoJa | aby zaszyfrowac wiadomosc algorytmem RSA musimy podzielic ja na bloki mniejsze od n |
21:22 | JaBoJa | czyli jesli n mialaby 200 bitow znaczacych to wiadomosc dzielimy na bloki 199 bitowe (dzieki temu mamy gwarancje, ze kazdy blok bedzie liczba mniejsza od n) |
21:24 | JaBoJa | szyfrogram takiego bloku danych obliczamy podnoszac (mod n) liczbe reprezentujaca ten blok do potegi rownej kluczowi |
21:24 | JaBoJa | szyfrogram = (tekst^e) mod n |
21:25 | JaBoJa | deszyfrowanie przebiega analogicznie, acz z drugim kluczem: |
21:25 | JaBoJa | tekst = (szyfrogram^d) mod n |
21:26 | JaBoJa | to ze wybierzemy dla kazdego generowanego klucza to samo e (np. 65537) nie ma wplywu na bezpieczenstwo jesli tylko liczby p i q sa rzeczywiscie losowe |
21:26 | JaBoJa | inna sprawa ze algorytmy generowania losowych liczb pierwszych sa probabilistyczne |
21:27 | JaBoJa | mozemy uzyskac liczby p i q nie bedace pierwszymi i pojawi sie problem |
21:27 | JaBoJa | zwykle przy probie szyfrowania nie uda sie odkodowac wiadomosci |
21:27 | JaBoJa | gorzej jesli zdaza sie nam takie liczby ze szyfrowanie sie powiedzie, ale klucze beda latwe do zlamania |
21:28 | JaBoJa | jednak generalnie algorytm RSA jest bezpiecznym algorytmem |
21:29 | JaBoJa | Innym algorytmem niesymetrycznym, ktory notabene tak jak RSA dziala w obie strony (tj. zarowno jako mechanizm podpisu elektronicznego jak i jako mechanizm szyfrowania) jest algorytm ElGamela |
21:30 | JaBoJa | generujac klucz w tym algorytmie: |
21:30 | JaBoJa | Najpierw wybieramy losowa liczbe pierwsza p |
21:31 | JaBoJa | Nastepnie dwie losowe liczby g, x < p |
21:31 | JaBoJa | i obliczamy: |
21:31 | JaBoJa | y = g^x (mod p) |
21:32 | JaBoJa | (reszta z dzielenia (g do potegi x ) przez p) |
21:32 | JaBoJa | kluczem publicznym jest trojka liczb (y, g, p), zas prywatnym liczba x |
21:33 | JaBoJa | dodatkowo dla uproszczenia algorytmu mozemy uzywac tych sam liczb (g, p) do generacji kluczy dla kilku roznych uzytkownikow |
21:34 | JaBoJa | Szyfrowanie algorytmem ElGamela: |
21:35 | JaBoJa | Generujemy liczbe losowa k, taka ze k jest wzglednie pierwsze z (p-1) |
21:35 | JaBoJa | SZyfrogram stanowi para liczb (a,b) obliczonych wzorami: |
21:36 | JaBoJa | a = (g^k) mod p |
21:36 | JaBoJa | b = ((y^k)*wiadomosc) mod 5 |
21:37 | JaBoJa | O ile w przypadku RSA szyfrogram byl podobnej (mniejwiecej z przewaga wicej :P) dlugosci jak tekst jawny to tutaj jest on okolo dwa razy dluzszy |
21:37 | JaBoJa | (bo stanowia go dwie liczby) |
21:38 | JaBoJa | aby odszyfrowac wiadomosc wystarczy obliczyc: |
21:38 | JaBoJa | wiadomosc = b/a^x mod p |
21:40 | JaBoJa | Dla diabla dodatkowo zacytuje z ksiazki "Kryptografia dla praktykow" B. Schneiera fragment tabeli z czasami szyfrowania dla roznych dlugosci liczby p: |
21:41 | JaBoJa | [wykladnik potegi ma 160 bitow, a algorytm byl obliczany na komputerze Sparc II] |
21:41 | JaBoJa | 512 bitow - Szyfrowanie 0,33s / Deszyfrowanie 0,24s |
21:42 | JaBoJa | 768 bitow - Szyfrowanie 0,80 s / Deszyfrowanie 0,58 s |
21:42 | JaBoJa | 1024 bity - Szyfrowanie 1,09s / Deszyfrowanie 0,77 s |
21:43 | JaBoJa | Notabene w przypadku sprawdzania podpisu elektronicznego algorytmem ElGamela (o tym za chwile) w przypadku 1024 bitow czas wynosi 9,30 s, czyli jest dosyc dlugi |
21:44 | JaBoJa | pozatym nalezy pamietac ze przy wzroscie dlugosci wiadomosci czas odpowiednio rosnie |
21:45 | JaBoJa | czyli jesli p ma 1024 bity, to mozna nim zaszyfrowac nie wiecej niz 1024b/8 = 128B |
21:46 | JaBoJa | jesli chcemy zaszyfrowac np. 5kB plik Worda to uzyskamy czas (5000B / 128B) * 1,09s ~= 43s |
21:47 | JaBoJa | dlatego lepiej jest uzywac do samej wiadomosci algorytmow symetrycznych a niesymetrcyzne tylko do losowego klucza |
21:47 | JaBoJa | Wracajac do samego algorytmu |
21:47 | JaBoJa | Podpis cyfrowy algorytmem ElGamela: |
21:48 | JaBoJa | Musimy jak poprzednio wygenerowac liczbe losowa k wzglednie pierwsza z (p-1) |
21:48 | JaBoJa | obliczmy: a = g^k mod p |
21:49 | JaBoJa | nastepnie musimy obliczyc b z rownania: |
21:49 | JaBoJa | wiadomosc = (x*a + k*b) mod (p-1) |
21:49 | JaBoJa | uzywamy tu notabene tego samego algorytmu co przy generowaniu kluczy RSA |
21:50 | JaBoJa | jest to tzw. rozszerzony algorytm Euklidesa |
21:50 | JaBoJa | podpisem jest tu, podobnie jak szyfrogramem przy szyfrowaniu, para liczb -> (a, b) |
21:51 | JaBoJa | Sprawdzenie podpisu (czyli de facto deszyfrowanie): |
21:52 | JaBoJa | (y^a)(a^b) mod p = g^wiadomosc mod p |
21:52 | JaBoJa | jesli rownanie to jest prawdziwe podpis jest audentyczny |
21:53 | JaBoJa | algorytm nie jest tu odwracalny w tym sensie ze mozna bezproblemowo zamienic klucz publiczny z prywatnym, bo obliczenie wiadomosci z powyzszego wzoru moze byc niejednoznaczne |
21:54 | JaBoJa | Uwaga: k musi byc za kazdym razem generowane od nowa, bo inaczej znajac dwa podpisy z ta sama wartoscia k mozna odtworzyc klucz prywatny. |
22:01 | JaBoJa | Teraz przejde do algorytmu DSA |
22:01 | JaBoJa | nie jest to algorytm sluzacy do szyfrowania wiadomosci, ale do podpisow elektronicznych |
22:02 | JaBoJa | algorytm ten uzywa ponadto jednokierunkowej funkcji skrotu realizowanej algorytmem SHA-1 |
22:03 | JaBoJa | generujemy liczbe pierwsza p o dlugosci L bitow, gdzie L ma wartosc od 512 do 1024 i jest wielokrotnoscia 64 |
22:04 | JaBoJa | obliczamy q - czynnik pierwszy liczby (p-1) majacy dlugosc 160 bitow |
22:04 | JaBoJa | nastepnie obliczamy liczbe g taka ze: |
22:05 | JaBoJa | g = ( h ^ ((p-1)/q) ) mod p; h jest dowolna liczba mniejsza od (p-1) oraz g>1 |
22:06 | JaBoJa | te trzy liczby sa jawne i ponadto moga byc wspolne dla wielu uzytkownikow |
22:06 | JaBoJa | nastepnie generujemy klucz prywatny x: |
22:07 | JaBoJa | x < q |
22:07 | JaBoJa | klucz publiczny y obliczamy ze wzoru: |
22:07 | JaBoJa | y = (g^x) mod p |
22:08 | JaBoJa | Podpisywanie wiadomosci wyglada tu nastepujaco: |
22:08 | JaBoJa | tak jak w poprzednim algorytmie generujemy liczbe losowa k. k powinno byc mniejsze od q. |
22:09 | JaBoJa | Podpisem jest para (r,s) obliczona wzorami: |
22:09 | JaBoJa | r = (g^k mod p) mod q |
22:10 | JaBoJa | s = ( k^(-1) * (sha1(wiadomosc) + x*r) ) mod q |
22:11 | JaBoJa | uwaga! k do minus pierwszej oznacza ze uzywamy algorytmu Euklidesa |
22:11 | JaBoJa | mozemy to inaczej zapisac: |
22:11 | JaBoJa | s*k = (sha1(wiadomosc) + x*r) mod q |
22:12 | JaBoJa | Weryfikacja podpisu przez odbiorce: |
22:12 | JaBoJa | 1. Obliczamy w ze wzoru: w*s = 1 (mod q) |
22:13 | JaBoJa | (notabene to co ja tu pisze w jakims jezyku programowania pewnie mialoby forme: w*s mod q == 1) |
22:14 | JaBoJa | 2. u1 = (sha1(wiadomosc) * w) mod q |
22:14 | JaBoJa | 3. u2 = (r*w) mod q |
22:14 | JaBoJa | 4. v = ((g^u1 * y^u2) mod p) mod q |
22:15 | JaBoJa | v powinno być równe r |
22:15 | JaBoJa | jeli jest inaczej podpis nie jest audentyczny |
22:17 | JaBoJa | Na dzisiaj to juz koniec wykladu, material jest jednak dosc obszerny, wiec postaram sie dokonczyc jego omawianie w przyszlym tygodniu (dokladny dzien i godzine podam na forum). |
22:18 | JaBoJa | Na koniec standardowe pytanie: sa jakies pytania? |
22:18 | garbus_ | Dzięki, ze spónieniem ale doczytałem. |
22:18 | garbus_ | ;] |
22:19 | JaBoJa | Do zobaczenia na nastepnym wykladzie ;) |