Podręcznik

5. Szyfry i kryptografia

5.11. Algorytm szyfrowania szyfrem RSA

Szyfr RSA jest typowym, najczęściej stosowanym szyfrem z kluczem publicznym. Nazwa RSA pochodzi od nazwisk 3 profesorów z MIT (Massachussets Institute of Technology) R.L.Rivesta, A.Shamira i L.M.Adlemana, którzy w roku 1978 opracowali koncepcję tego szyfru. Szyfr RSA uważany jest za jeden z najbezpieczniejszych, najpewniejszych szyfrów. Używany jest do szyfrowania wiadomości, do tworzenia podpisów cyfrowych oraz dystrybucji kluczy kryptograficznych.

Opiszemy teraz, jak tworzymy system kryptograficzny RSA. Potrzebne nam będzie przy omawianiu szyfru RSA pojęcie funkcji Eulera. Dla danej liczby naturalnej n symbolem (n) oznaczamy liczbę liczb naturalnych względnie pierwszych z n i mniejszych od n, tzn. (n) card{<i>m</i> <font face="Symbol, serif"></font> <i>N</i>; <i>m</i> <font face="Symbol, serif"></font> <i>n</i>, <i>NWD</i>(<i>m</i>, <i>n</i>) <font face="Symbol, serif"></font> 1}. W ten sposób definiujemy funkcję : N N , która nazywa się funkcją Eulera. Łatwo można wykazać, że jeśli p jest liczbą pierwszą to ( p) p 1 i dla każdego k N , mamy

( pk ) pk 1( p 1) \qquad(1)

Jeśli m i n są względnie pierwszymi liczbami naturalnymi to mamy

(mn) (m) (n) \qquad(2)

Z (1) i (2) dostajemy, że jeśli n p1k1 p2k2 ... prkr , gdzie p1, p2 ,..., pr są parami różnymi liczbami pierwszymi to

(n) p1k1 1 ( p1 1) p2k2 1 ( p2 1) ... prkr 1 ( pr  1) \qquad(3)

Wybieramy teraz dwie duże liczby pierwsze p i q obliczamy iloczyn n=pq oraz wartość funkcji Eulera (n) ( p 1)(q 1) . Wybieramy następnie losowo dowolną taką liczbę (n) d Z(n) , dla której istnieje element odwrotny e d 1 w pierścieniu Z (n) czyli takie e Z (n) by d (n) e 1 w pierścieniu Z (n) (oczywiście jest to równoważne temu by znaleźć takie e Z (n) , żeby d e 1 (mod (n)) ). Warunkiem koniecznym i dostatecznym na to by istniał taki element odwrotny jest by NWD( (n), d ) 1 . Obliczamy e d 1 i ujawniamy parę uporządkowaną (e,n) jako klucz publiczny. Kluczem prywatnym będzie para uporządkowana (d,n).

Tekst szyfrowany, czyli tekst jawny m V1   np. "ala ma kota" zamieniamy na liczbę całkowitą x np. 10982398.

Podnosimy tę liczbę do ustalonej potęgi e w pierścieniu Zn ((e,n) jest znane i stanowi klucz publiczny) lub co na jedno wychodzi podnosimy tę liczbę do potęgi e w pierścieniu Z i bierzemy resztę z dzielenia tej liczby przez liczbę n. Tę resztę wysyłamy do adresata.

c xe

Adresat podnosi (w pierścieniu Zn ) uzyskaną liczbę do pewnej potęgi d będącej kluczem tajnym czyli kluczem prywatnym uzyskując wiadomość jawną x.

x cd

Algorytmy RSA mające klucz o długości do 512 bitów, są stosunkowo proste do złamania. Adi Shamir opracował w 1999 r. specjalizowany równoległy komputer łamiący 512 bitowe RSA w ciągu 2 dni. Obecnie stosuje się już klucze 1024 bitowe a nawet 2048 i 4096 bitowe praktycznie całkowicie bezpieczne (w 2003 r.) tzn. nie do złamania przy współczesnym stanie wiedzy o algorytmach komputerowych i przy współczesnych możliwościach obliczeniowych systemów cyfrowych.
Rivest, Shamir i Adleman w słynnej słynnej zagadce zamieszczonej w 1977 roku w czasopiśmie "Scientific American" zamieścili szyfrogram pewnego tekstu jawnego, proponując czytelnikom odtworzenie tego tekstu z szyfrogramu. Użyli przy tym szyfru nazwanego później RSA-129. Liczba 129 w oznaczeniu bierze się od 129 cyfrowej liczby (cyfry dziesiętne), którą trzeba rozłożyć na czynniki pierwsze by uzyskać klucz i funkcję odwrotną deszyfrującą szyfrogram. Zadanie przed którym stanęli czytelnicy było więc typowym problemem przed którym staje kryptoanalityk. Szyfr RSA-129 został w końcu złamany w 1994 roku dzięki równoległej pracy wielu komputerów w sieci komputerowej i superkomputerów równoległych.
Fakt praktyczny: żeby złamać szyfr RSA musimy umieć rozkładać duże liczby na czynniki pierwsze. Do określenia funkcji odwrotnej do funkcji szyfrującej czyli funkcji deszyfrującej potrzebna jest znajomość 2 liczb pierwszych, p i q, których iloczyn daje n.

Wykażemy teraz poprawność RSA. Skorzystamy z następującego lematu będącego konsekwencją chińskiego twierdzenia o resztach.

Lemat: Niech m1 , m2 ,..., mn N będą parami względnie pierwsze (tzn. NWD(mi , m j ) 1 dla każdego i, j  1, n ,i j ) i mi 2 dla każdego i=1,2,...,n oraz niech a, b będą dowolnymi liczbami całkowitymi czyli a, b Z .

a b(mod mi ) dla każdego i=1,2,...,n wtedy i tylko wtedy gdy a b(mod m1 m2 ... mn )

Dowód poprawności algorytmu RSA: Z założenia ed 1 (mod (n)), zatem istnieje takie k Z , że

ed 1 k (n)\qquad(*)

Załóżmy teraz, że wiadomość jawna m Zn jest względnie pierwsza z p, czyli NWD(m, p) 1 . Z małego twierdzenia Fermata mamy wówczas:

m p1 1 (mod p) \qquad(**)

Podnosząc obie strony kongruencji (**) do potęgi k (q 1) i mnożąc przez m dostajemy:

m1k ( p1)(q1) m(mod p)

a więc korzystając z (*) mamy:

med m(mod p) .

Jeżeli NWD(m, p) 1 , to NWD(m, p) p . Zatem również mamy wówczas:

med m(mod p)\qquad (***)

Istotnie, ponieważ m jest podzielna przez p, więc med 0(mod p) i m 0(mod p), i kongruencja (***) zachodzi.

Zatem niezależnie od tego czy NWD(m, p) 1 , czy NWD(m, p) 1 , zawsze mamy

med m(mod p) .

Podobnie możemy rozumować dla liczby pierwszej q otrzymując

med m(mod q)

Z lematu dostajemy ostatecznie, że med m(mod pq) .

Probabilistyczne uzasadnienie algorytmu RSA: Warto zwrócić uwagę na to, że nie wymagamy w założeniach powyższego twierdzenia by tak jak w założeniach twierdzenia Eulera. Próba uzasadniania kongruencji NWD(a, n) 1, med m(mod pq) twierdzeniem Eulera byłaby więc zręcznym korzystaniem z nieuwagi Czytelnika.

Jednak przy n p1 p2 (gdzie czynniki są liczbami pierwszymi) i założeniu równomiernego rozkładu prawdopodobieństwa na zbiorze Zn prawdopodobieństwo tego, że NWD(a, n) 1 maleje do 0 wraz ze wzrostem p1 i p2 . Istotnie z definicji funkcji Eulera mamy, że:

P({<i>a </i><font face="Symbol, serif"></font> <i>Z</i> ; <i>NWD</i>(<i>a</i>, <i>n</i>) <font face="Symbol, serif"></font> 1}) \frac{n - \phi (n) }{n} 
= \frac{n - (p_1-1)\cdot(p_2-1) }{n}
= \frac{(p_1 + p_2 -1) }{p_1\cdot p_2} 
= \frac{1}{p_1} + \frac{1}{p_1} - \frac{1}{n}

a więc P({<i>a</i> <font face="Symbol, serif"></font> <i>Z</i><sub><i>n</i> </sub>; <i>NWD</i>(<i>a</i>, <i>n</i>) <font face="Symbol, serif"></font> 1}) 0 jeśli p1  i p2 

zatem sytuacja, że NWD(a, n) 1 nie zachodzi staje się bardzo mało prawdopodobna.

Uwagi końcowe o algorytmie RSA: Szyfr RSA jako algorytm z kluczem publicznym może być wykorzystywany zarówno do zwykłego szyfrowania jak również do dystrybucji tzw. kluczy sesyjnych oraz realizacji algorytmów podpisów cyfrowych.

Bezpieczeństwo szyfru RSA jest zależne od tego czy istnieje efektywny algorytm rozkładu dużej liczby n na czynniki pierwsze (dotychczas nie jest znany taki efektywny algorytm). Dokładniej, gdyby taki algorytm istniał to moglibyśmy łatwo obliczyć wartość funkcji Eulera (n) , n jest ogólnie znanym parametrem sytemu kryptograficznego. Odtworzenie klucza prywatnego z klucza publicznego sprowadzałoby się w tej sytuacji do znalezienia elementu odwrotnego do klucza publicznego w pierścieniu Z (n) co sprowadza się z kolei do realizacji rozszerzonego algorytmu Euklidesa (istnieją szybkie efektywne wersje tego algorytmu np. algorytm Stein'a).

Główną wadą algorytmu RSA jest jego znacznie większa złożoność obliczeniowa w porównaniu z innymi algorytmami szyfrowania jak np. algorytmem DES. Okazuje się to specjalnie kłopotliwe, gdy zależy nam na szyfrowaniu w czasie rzeczywistym, np. gdy szyfrujemy próbki sygnału mowy w systemie telekomunikacyjnym.