Klucz kodowania - \( K_K \) to parametr(y) funkcji kodującej. Znając je można wysyłać zakodowane wiadomości.
Klucz dekodowania - \( K_D \) to paramert(y) funkcji dekodującej. Znając je można dekodować wiadomości.
Przez wieki uważano, że w dowolnym kryptosystemie znajomość klucza kodujacego \( K_K \) pozwala na szybkie poznanie klucza dekodującego znajomość \( K_D \), czyli że każdy kto umie kodować wiadomości może je też dekodować. Tak jest w rozważanym powyżej kryptosystemie Cezara. Jeśli Cezar używał tego samego kryptosystemu do kontaktu ze wszystkimi swoimi generałami, wtedy mogło dochodzić do sytuacji niepożądanych np. gdy generał A wysłał Cezarowi zaszyfrowaną wiadomość, generał B przechwytując kuriera po drodze mógł ją odczytać.
Kryptosystem z kluczem publicznym to system \( (\mathcal{J},f,K_K, K_D) \), gdzie \( K_K \) i \( K_D \) są odpowiednio kluczem kodującym i dekodującym, w którym
Szukamy więc funkcji \( f \) którą w jedną stronę liczy się relatywnie szybko na podstawie znajomości \( K_K \). Natomiast jej odwrotna \( f^{-1} \) jest bardzo trudna do policzenia bez dodatkowej informacji \( K_D \). W sposób naturalny przychodzi tu na myśl problem znajdowania rozkładu na czynniki pierwsze liczb naturalnych. W szczególności: wymnożenie dwu dużych liczb pierwszych jest łatwe (można to zrobić w czasie wielomianowym od długości ich zapisu), natomiast szybkie znalezienie rozkładu na czynniki pierwsze ich iloczynu (bez znajomości wyjściowych liczb lub innych dodatkowych informacji) wydaje się być problemem ekstremalnie trudnym. Właśnie na tym spostrzeżeniu oparta jest idea kryptosystemu RSA.
Nazwa kryptosystemu pochodzi od pierwszych liter nazwisk jego trzech pomysłodawców: Rivest, Shamir i Adelman. Choć jest to jeden z najstarszych kryptosystemów z kluczem publicznym (wynaleziony w 1977 roku) wciąż jest szeroko stosowany w komercyjnych protokołach. Jedynie długości kluczy rosną wraz ze wzrostem mocy obliczeniowej komputerów.
Uwaga: jest to oczekiwany czas działania, a nie maksymalny (pesymistyczny).
Poprawność tego kryptosystemu, czyli że \( f^{-1}(f(P))=P \), dla dowolnego \( P\in\mathbb{Z}_n \) wynika bezpośrednio z następującej obserwacji:
Obserwacja 7.1 [Poprawność RSA]
\( P^{ed}\ \equiv_{n}1 ,\qquad \) dla dowolnego \( P \in \mathbb{Z}_n \).
Dowód
Ponieważ \( ed\ \equiv_{\varphi(n)}1 \) mamy \( ed=a\varphi(n)+1 \) dla pewnego \( a \).
Załóżmy najpierw, ze \( p\perp n \). Wtedy z Twierdzenia Eulera dostajemy \( P^{\varphi(n)}\ \equiv_{n}1 \), a zatem \( P^{ed}=P^{a\varphi(n)+1}\equiv_n P \).
Jeśli zaś \( p\not\perp n \), to \( p|P \) lub \( q|P \). Załóżmy, bez straty ogólności, że \( q|P \), czyli \( P=bq \) dla pewnego \( 0 < b < p \), bo \( bq=P < n=pq \). Na mocy Małego Twierdzenia Fermata mamy:
\( \begin{align*} b^{p-1} & \equiv_p & 1, \\ q^{p-1} & \equiv_p & 1, \end{align*} \)
skąd:
\( \begin{align*} b^{a(p-1)(q-1)} & \equiv_p & 1, \\ q^{a(p-1)(q-1)} & \equiv_p & 1, \end{align*} \)
i dalej
\( \begin{align*} b\cdot(bq)^{a(p-1)(q-1)} & \equiv_p & b \cdot 1 = b. \end{align*} \)
Mnożąc obie strony ostatniej kongruencji przez \( q \) dostajemy
\( \begin{align*} bq\cdot(bq)^{a(p-1)(q-1)} & \equiv_{pq} & bq \end{align*} \)
czyli
\( P^{ed} = (bq)^{a(p-1)(q-1)+1}= (bq)\cdot (bq)^{a(p-1)(q-1)} \equiv_n bq = P, \)
co było do udowodnienia.
Bezpieczeństwo kryptosystemu RSA opiera się na domniemaniu trudności następującego problemu:
Szybkie rozwiązanie problemu faktoryzacji rozwiązałoby problem RSA. Gdyby ktoś znał rozkład \( n \), to znaczy liczby \( p \) i \( q \), miałby także \( \varphi(n)=(p-1)(q-1) \). Wtedy, korzystając z publicznie dostępnego \( e \), obliczyłby rozszerzonym algorytmem Euklidesa \( d \). Dopóki nie jest znany efektywny algorytm rozwiązujący jeden z tych problemów (problem RSA, problem faktoryzacji) kryptosystem RSA pozostaje bezpieczny. Wzrastająca szybkość komputerów zmusza użytkowników RSA do zwiększania długości kluczy. Obecnie stosowane klucze mają najczęściej \( 1024 \) lub \( 2048 \) bitów. Największy złamany klucz (klucz dla którego znaleziono rozkład) ma długość \( 663 \) bity (stan z roku 2005).
W praktyce wiadomość przed zakodowaniem podlega wstępnej obróbce (padding). Zauważmy, że wartości \( 0 \) i \( 1 \) nie podlegają zmianie przy kodowaniu (z własności potęgowania), przez co stanowią one część informacji czytelnej dla wszystkich nawet w szyfrogramie. W praktyce różnymi metodami unika się takich wartości. Rozważania te już jednak wykraczają poza tematykę tego wykładu.
Przykład
Widzieliśmy, że znając rozkład \( n= pq \) można łatwo obliczyć \( \varphi(n) \), a tym samym klucz \( d \) odpowiadający publicznemu kluczowi \( e \). Na odwrót, znając \( n \) oraz \( \varphi(n) \) można szybko rozłozyć liczbę \( n \) na czynniki pierwsze:
a zatem mamy rozwiązać układ równań postaci:
\( \begin{align*} x \cdot y & = a \\ x + y & = 2b \end{align*} \)
skąd \( x,y \) wynoszą \( b \pm \sqrt{b^2-a} \).
Pokazuje to, że wartości funkcji Eulera sa równie trudne do policzenia, jak faktoryzacja liczb.
Uwaga
Kryptosystem RSA wykorzystywany jest poza szyfrowaniem również w wielu innych protokołach kryptograficznych. Na bazie tego systemu można na przykład zbudować podpis elektroniczny. Mimo, że zagadnienia te wykraczają już znacznie poza treść tego wykładu, pokazują one jak wielką rolę odgrywa obecnie teoria liczb w informatyce.