Gdy przeglądarka nawiązuje bezpieczne połączenie albo podpisujesz dokument elektronicznie, w tle może działać RSA. To algorytm kryptografii asymetrycznej, który wykorzystuje parę kluczy i pozwala zarówno chronić dane, jak i potwierdzać tożsamość nadawcy. Wyjaśniam, RSA, co to właściwie znaczy w praktyce, jak działa ten mechanizm, gdzie się go stosuje oraz jak bezpiecznie używać go w Pythonie.
Najważniejsze fakty o RSA w jednym miejscu
- Dwa klucze pozwalają rozdzielić szyfrowanie od odszyfrowywania.
- Klucz publiczny można udostępniać, ale klucz prywatny musi pozostać tajny.
- RSA służy także do podpisów cyfrowych, a nie tylko do szyfrowania.
- W nowych wdrożeniach stosuje się zwykle RSA 2048 bitów lub więcej.
- RSA nie jest dobrym wyborem do szyfrowania dużych plików.

RSA, co to właściwie znaczy w cyberbezpieczeństwie
RSA to asymetryczny algorytm kryptograficzny nazwany od nazwisk jego twórców: Rona Rivesta, Adiego Shamira i Leonarda Adlemana. Jego najważniejszą cechą jest użycie dwóch powiązanych ze sobą kluczy. NIST opisuje RSA jako algorytm stosowany między innymi do ustanawiania kluczy oraz tworzenia i sprawdzania podpisów cyfrowych.
Klucz publiczny można przekazać innym osobom lub opublikować w certyfikacie. Klucz prywatny przechowuje wyłącznie właściciel. Wiadomość zaszyfrowana kluczem publicznym może zostać odszyfrowana tylko przy użyciu odpowiadającego mu klucza prywatnego.
To właśnie odróżnia RSA od szyfrowania symetrycznego, takiego jak AES. W AES ten sam sekret służy do szyfrowania i odszyfrowywania, więc obie strony muszą wcześniej bezpiecznie wymienić klucz. RSA rozwiązuje problem jego przekazania, choć robi to kosztem większego obciążenia obliczeniowego.
Algorytm ma również drugie zastosowanie. Nadawca może utworzyć podpis przy użyciu klucza prywatnego, a odbiorca sprawdzić go kluczem publicznym. Taki podpis potwierdza integralność danych i autentyczność nadawcy, ale sam w sobie nie ukrywa treści wiadomości.
Jak RSA wykorzystuje dwa klucze i liczby pierwsze
Bez matematyki RSA może wyglądać jak czarna skrzynka, ale jego podstawowa idea jest dość elegancka. Bezpieczeństwo opiera się na tym, że łatwo pomnożyć dwie bardzo duże liczby pierwsze, natomiast niezwykle trudno rozłożyć ich iloczyn z powrotem na czynniki.
Podczas generowania pary kluczy program wykonuje kilka operacji:
- Losuje dwie duże liczby pierwsze oznaczane zwykle jako p i q.
- Oblicza moduł n = p × q. To część klucza publicznego.
- Wyznacza funkcję Eulera dla tych liczb.
- Wybiera wykładnik publiczny e, najczęściej 65537.
- Oblicza wykładnik prywatny d, który jest matematyczną odwrotnością e w odpowiednim układzie modulo.
Klucz publiczny składa się przede wszystkim z pary (n, e), natomiast klucz prywatny zawiera wartość d oraz dodatkowe dane potrzebne do szybkich obliczeń. Osoba postronna może znać n i e, ale odzyskanie klucza prywatnego wymagałoby efektywnego rozłożenia ogromnej liczby n na p i q.
Mały przykład, który pokazuje mechanizm
Dla celów edukacyjnych można przyjąć p = 5 i q = 11. Otrzymujemy wtedy n = 55, a po wybraniu e = 3 wykładnik prywatny wynosi d = 27. Jeśli wiadomość oznaczymy liczbą 7, szyfrowanie daje wynik 7³ mod 55 = 13, a odszyfrowanie liczby 13 przy użyciu d przywraca wartość 7.
Tak małe liczby są oczywiście całkowicie niebezpieczne. Ten przykład pokazuje tylko zasadę działania, a nie sposób tworzenia prawdziwego klucza. W realnym systemie liczby mają tysiące bitów, a wiadomość przed operacją RSA przechodzi przez bezpieczny schemat wypełniania, czyli padding.
Sam wzór nie wystarcza
Jednym z częstszych błędów początkujących jest traktowanie RSA jako prostego działania potęgowania. Surowe RSA, czyli użycie samego wzoru bez odpowiedniego paddingu, nie powinno być stosowane w aplikacji. Do szyfrowania wykorzystuje się na przykład OAEP, a do podpisów cyfrowych PSS. Zasady tych schematów opisuje standard PKCS #1 w dokumencie RFC 8017.
Gdzie spotykam RSA w praktycznych systemach
RSA nie jest technologią używaną wyłącznie w laboratoriach kryptografii. Przez lata stał się jednym z fundamentów infrastruktury klucza publicznego, czyli systemu certyfikatów, urzędów certyfikacji i podpisów elektronicznych.
Certyfikaty i bezpieczne połączenia
Certyfikat strony internetowej może zawierać publiczny klucz RSA. Przeglądarka sprawdza podpis certyfikatu, ocenia, czy został wystawiony przez zaufany urząd, a potem wykorzystuje zawarte w nim informacje podczas ustanawiania bezpiecznego połączenia.
Współczesne protokoły nie szyfrują całej sesji RSA, bo byłoby to zbyt wolne. RSA może potwierdzać tożsamość serwera, natomiast do szyfrowania dalszej komunikacji używany jest zwykle szybki szyfr symetryczny. W TLS 1.3 nie stosuje się klasycznej wymiany klucza RSA, ale certyfikaty z podpisem RSA nadal mogą być używane.
Podpis elektroniczny
Przy podpisywaniu dokumentu system najpierw oblicza skrót kryptograficzny, na przykład SHA-256. Następnie podpisuje ten skrót kluczem prywatnym. Odbiorca używa klucza publicznego, aby sprawdzić, czy dokument nie został zmieniony i czy podpis pasuje do konkretnego nadawcy.
Trzeba przy tym pamiętać, że podpis cyfrowy nie jest szyfrowaniem. Podpis mówi, kto zatwierdził dane i czy pozostały nienaruszone. Jeśli treść ma pozostać tajna, potrzebny jest dodatkowo mechanizm szyfrowania.
Przeczytaj również: NGINX - Jak działa i dlaczego jest kluczowy dla Twojego backendu?
Poczta elektroniczna i wymiana kluczy
W systemach takich jak PGP lub S/MIME RSA może chronić klucz sesyjny, którym zaszyfrowano właściwą wiadomość. To rozwiązanie hybrydowe łączy wygodę kryptografii asymetrycznej z szybkością szyfrowania symetrycznego.
W praktyce RSA najlepiej sprawdza się przy małych danych, kluczach i podpisach. Nie warto używać go bezpośrednio do zaszyfrowania całego filmu, archiwum czy kopii bazy danych.
RSA, AES i ECC rozwiązują różne problemy
Porównywanie RSA z AES bez wyjaśnienia różnicy między kryptografią symetryczną i asymetryczną prowadzi do nieporozumień. Ja traktuję te technologie jako elementy jednego systemu, a nie konkurencyjne zamienniki.
| Technologia | Rodzaj klucza | Typowe zastosowanie | Najważniejsza cecha |
|---|---|---|---|
| RSA | Publiczny i prywatny | Podpisy, certyfikaty, ochrona kluczy sesyjnych | Łatwiejsza wymiana klucza, ale większy koszt obliczeń |
| AES | Jeden wspólny klucz | Szyfrowanie plików, dysków i połączeń | Bardzo szybkie działanie przy dużych danych |
| ECC | Publiczny i prywatny | Podpisy i uzgadnianie kluczy | Krótsze klucze przy podobnym poziomie bezpieczeństwa |
Przykładowo klucz RSA 2048 bitów zapewnia około 112 bitów bezpieczeństwa według wytycznych NIST. To poziom uznawany za akceptowalny dla wielu zastosowań, ale przy długim okresie ochrony można rozważyć RSA 3072. Samo zwiększenie rozmiaru klucza nie naprawi jednak błędnego użycia algorytmu.
W systemie hybrydowym RSA szyfruje niewielki klucz AES, a AES szyfruje całą wiadomość. Taki model jest zwykle rozsądniejszy niż próba użycia RSA do każdego fragmentu danych.
Jak bezpiecznie użyć RSA w Pythonie
W Pythonie nie implementowałbym RSA samodzielnie. Biblioteki kryptograficzne rozwiązują problemy, których łatwo nie zauważyć, takie jak dobór losowości, padding, format kluczy i bezpieczne obchodzenie się z błędami. Popularnym wyborem jest pakiet cryptography.
Poniższy przykład tworzy klucz RSA 2048 bitów i szyfruje krótką wiadomość przy użyciu OAEP:
from cryptography.hazmat.primitives.asymmetric import rsa, padding
from cryptography.hazmat.primitives import hashes
private_key = rsa.generate_private_key(
public_exponent=65537,
key_size=2048
)
public_key = private_key.public_key()
message = b"Tajna wiadomosc"
ciphertext = public_key.encrypt(
message,
padding.OAEP(
mgf=padding.MGF1(algorithm=hashes.SHA256()),
algorithm=hashes.SHA256(),
label=None
)
)
plaintext = private_key.decrypt(
ciphertext,
padding.OAEP(
mgf=padding.MGF1(algorithm=hashes.SHA256()),
algorithm=hashes.SHA256(),
label=None
)
)
Ten fragment jest dobrym ćwiczeniem, ale aplikacja produkcyjna musi jeszcze bezpiecznie zapisać klucz prywatny, kontrolować dostęp i obsługiwać rotację kluczy. Nie umieszczałbym prywatnego klucza w repozytorium ani bezpośrednio w kodzie programu.
Do podpisu cyfrowego używa się innej operacji niż do szyfrowania. W praktyce należy podpisać dane odpowiednim schematem, najczęściej RSA-PSS, a po stronie odbiorcy zweryfikować podpis przy użyciu klucza publicznego. Klucz publiczny nie jest sekretem, ale musi być wiarygodnie przypisany do osoby lub usługi.
Co najczęściej psuje bezpieczeństwo RSA
Największe ryzyko rzadko wynika z samej matematyki. Częściej problemem jest zła konfiguracja albo niewłaściwe zarządzanie kluczem. Nawet poprawny algorytm nie ochroni danych, jeśli klucz prywatny wycieknie z serwera.
- Za krótki klucz - RSA 1024 bitów należy traktować jako rozwiązanie historyczne, nie jako wybór do nowych systemów.
- Brak paddingu - surowe RSA jest podatne na praktyczne ataki i nie powinno być używane.
- Losowanie niskiej jakości - przewidywalne liczby pierwsze mogą umożliwić odzyskanie klucza.
- Współdzielenie klucza prywatnego - gdy wiele usług korzysta z tego samego sekretu, rośnie skala skutków wycieku.
- Mylenie podpisu z szyfrowaniem - podpis potwierdza autentyczność, ale nie zapewnia poufności.
- Brak weryfikacji klucza publicznego - atakujący może podstawić własny klucz podczas wymiany.
Rozmiar klucza powinien wynikać z polityki bezpieczeństwa i przewidywanego czasu ochrony danych. 2048 bitów to rozsądne minimum dla wielu obecnych wdrożeń, 3072 bity dają większy margines, a 4096 bitów zwiększa koszt operacji i nie zawsze przynosi proporcjonalną korzyść.
RSA nie jest też odporne na przyszłe komputery kwantowe wykorzystujące algorytm Shora. Nie oznacza to, że należy dziś porzucić każdą istniejącą instalację, ale przy projektowaniu systemu na wiele lat trzeba brać pod uwagę migrację do algorytmów postkwantowych.
Najważniejsza decyzja przy wdrażaniu RSA
RSA najlepiej rozumieć jako narzędzie do rozwiązania konkretnego problemu zaufania. Klucz publiczny pozwala bezpiecznie rozpocząć kontakt, a prywatny potwierdza tożsamość właściciela. Do szyfrowania dużych ilości danych lepiej użyć AES, a RSA pozostawić do podpisów i ochrony małych sekretów.
Jeżeli wdrażam RSA w aplikacji, wybieram sprawdzoną bibliotekę, klucz co najmniej 2048-bitowy, OAEP dla szyfrowania i PSS dla podpisów. Najwięcej bezpieczeństwa daje nie sam algorytm, lecz cały proces obejmujący generowanie, przechowywanie, używanie i wymianę kluczy.
