Informatyka, studia dzienne, inż. I st. semestr VI Podstawy Kryptografii - laboratorium 2010/2011 Prowadzący: prof. dr hab. Włodzimierz Jemec poniedziałek, 08:30 Data oddania: Ocena: Marcin Piekarski 150972 Kamil Stasiak 143099 Michał Mela 150940 Michał Kamiński 150897 Zadanie 1: Protokół ślepych podpisów cyfrowych w oparciu o algorytm RSA 1. Cel Celem zadania było napisanie protokołu ślepych podpisów cyfrowych w oprarciu o algorytm RSA. Ponaddto stworzenie aplikacji, która wysyła dokument do podpisu otrzymuje podpisany dokument i sprawdza poprawność podpisu. 2. Opis algorytmu RSA Algorytm RSA jest algorytmem szyfracji danych asymetrycznie. Nazwa algotytmu pochodzi od jego autorów Rivesta, Shamira i Adlemana. Opiera się o parę kluczy tzw. klucz publiczny i klucz prywatny. Ważną własnościa algorytmu RSA jest przemienność: Jeżeli K 1 i K 2 są kluczami to dla dowolnej wiadomości m zachodzi: D K1 (E K2 (m)) = m (1) D K2 (E K1 (m)) = m (2) 1
2.1. Generowanie kluczy RSA Wybieramy losowo dwie duże liczby pierwsze p i q Obliczamy Wyznaczamy funkcję Eulera n = pq (3) ϕ(n) = (p 1)(q 1) (4) Losujemy liczbę e z przedziału (0,ϕ(n)), względnie pierwszą z ϕ(n). Znajdujemy liczbę d odwrotną do e mod ϕ(n) d e 1 mod ϕ(n) (5) Kluczem publicznym jest para (e, n) natomaiast klucze prywatnym jest (d, n). 2.2. Szyfrowanie i deszyfrowanie Wiadomość m dzielona jest na bloki m i przy czym m i jest nie większe niż n. Każdy z bloków szyfrowany jest kluczem publicznym według wzoru c i = m i e (6) Deszyfrowanie polega na podobnej operacji z użyciem klucza prywatnego. m i = c i d (7) Zgodnie ze wzorem 1 Możemy dokonać szyfracji i deszyfracji używając kluczy w odwrotnej kolejności. 3. Podpis cyfrowy Podpis cyfrowy jest matematycznym potwierdzeniem autentyczności dokumentu. Jest on odpowiednikiem tradycyjnego podpsiu, jaki składamy na dokumentach. Idealnym algorytmem do tworzenia podpisów cyfrowych jest wcześniej wspomniany algorytm RSA. Autor wiadomości szyfruje ją kluczem prywatnym. Odbiorca wiadomośći otrzymując ją jest w stanie odszyfrować ją kluczem publicznym i sprawdzić autentyczność wiadomości. Rozwiązanie takie ma zasadniczą wadę, gdyż podpis jest nie krótszy niż sama wiadomość. Najczęściej stosowane są jednokierunkowe funkcje hashujące. Autor wiadomości szyfruje wartość funkcji hashującej i przesyła ją razem z dokumentem. Odbiorca oblicza wartość funkcji hashującej i porównuje z odkodowaną wartością. 4. Ślepy podpis cyfrowy Ślepy podpis cyfrowy jest formą podpisu cyfrowego w którym osoba podpisująca nie zna podpisywanego dokumentu. Autor wiadomości i osoba podpisująca to de facto dwie różne osoby. Do generowania ślepych podpisów wyjątkowo dobrze nadaje się algorytm RSA. 2
4.1. Tworzenie ślepego podpisu cyfrowego Autor wiadomości najpierw pobiera klucz publiczny (e,n) osoby podpisującej wiadomość. Następnie zakrywa wiadomość m poprzez losową liczbę r. Liczba ta musi być względnie pierwsza z n. m mr e mod n (8) Tak zakodowaną wiadomość przesyła do osoby podpisującej, która tworzy ślepy podpis. s m d mod n (9) Ślepy podpis przesyłany jest do autora wiadmości, który usuwa czynnik zaślepiający. Przy czym s jest podpisem wiadomości i ponad to s s r 1 mod n (10) s m d mod n (11) 5. Architektura aplikacji W celu stworzenia protokołu ślepego podpisu cyfrowego stworzyliśmy dwie aplikacje. Jedną z nich jest apikacją webową służącą do tworzenia podpisu, drugą natomiast jest aplikacją desktopową będąca klientem usługi ślepych podpisów cyfrowych. Aplikacja webowa jest internetową usługą opartą o protokuł SOAP. Aplikacja napisana jest w technologii J2EE, oparta o kontekst spring i klasę DispatcherMessage udostępnioną przez bibliotekę spirng-ws. Klasa SigningServiceEndpoint jest klasą której interfejs jest wystawiany na zewnątrz aplikacji. Udostępiająca klucz publiczny, a także możliwość podpisania wiadomości. Każda z tych operacji jest symetryczna. Klucz, a także wiadomości przesyłane są w postaci liczby całkowitych. Skorzystaliśmy tutaj z klasy BigInteger pozwalającej na przesyłanie dowolnie dużych liczb. Klasą która generuje klucze publiczne i prywatne, a także podpisuje wiadomości jest klasa RSASigner. Jest ona singletonem, istnieje jedyna instancja, dlatego też za każdym razem klucze są takie same. Podpisywanie wiadomości polega na podniesieniu wiadomości do potęgi wartości klucza prywatnego, zgodnie ze wzorem 9. Aplikacja BlindSignClient jest aplikacją klienta powyżej wymienionej usługi internetowej. Oparta jest również o kontekst spring i korzysta z klienta web service udostępnionego przez bibliotekę spring. Może pracować w dwuch trybach. Jednym z nich to przesłanie do podpisu całego pliku bądź wiadomości. Drugim trybem jest przesłanie do podpisania skrótu wiadomości, korzystając z funkcji hashującej SHA-2. Przygotowuje ona wiadomość do przesłania szyfrując ją losową liczbą r zgodnie ze wzorem 8 a także usuwa czynnik zaślepiający zgodnie ze wzorem 10. 3
Rysunek 1. Diagram klas aplikacji SigningService 4
Rysunek 2. Diagram klas aplikacji BlindSingatureClient 5
Rysunek 3. Diagram sekwencji 6
6. Opis użycia aplikacji Aplikacja SigningService jest przystosowana do każdego rodzaju serwerów webowych wspierających technologię J2EE. W czasie testowania korzystaliśmy z kontenera webowego Tomcat 7.0.26. Aplikacja desktopowa przystosowana jest na każdy komputer posiadający maszynę wirtualną Javy. Zadaniem aplikacji desktopowej jest stworzenie podpisu pod wiadomością, dlatego możliwe jest wczytanie dowolnego pliku, jak także wpisanie wiadomości do aplikacji. Aplikacja daje możliwość wysłania do podpisu całej wiadomości jak i skrótu. Domyślnie podpisuje całą wiadomość. Jeżeli chcemy podpisać skrót należy zaznaczyć taką opcję. Dodatkową możliwością jest spradzenie poprawności podpisu. Jeżeli podpis odkodujemy kluczem publicznym, to zgodnie ze wzorem 11 otrzymamy wiadomość. Rysunek 4. Diagram przypadków użycia Literatura [1] Notatki wykładowe [2] Kutylowski M., Strothmann W.B., Kryptografia, Teoria i Praktyka, Zabezpieczanie systemów komputerowych, Warszawa 1998, Wyd. LUPUS [3] http://www.prz.rzeszow.pl/pl/zsr/pliki/bezpieczenstwo wyklady/konspekt boi 03.pdf 7