RSA — kryptosystem z kluczem publicznym zapewniający szyfrowanie i podpis cyfrowy w oparciu o złożoność obliczeniową faktoryzacji dużych liczb. Według NIST Special Publication 800-56B Rev. 2 (2023), RSA z długością klucza 2048 bitów pozostaje standardem bezpieczeństwa dla systemów rządowych i komercyjnych. Algorytm jest szeroko stosowany w protokołach TLS, podpisach cyfrowych i szyfrowaniu danych w aplikacjach mobilnych.
Najważniejsze
RSA — algorytm kryptograficzny z kluczem publicznym opracowany w 1977 roku przez Ronalda Rivesta, Adi Shamira i Leonarda Adlemana. Nazwa pochodzi od pierwszych liter nazwisk autorów. Algorytm był pierwszym praktycznie stosowanym asymetrycznym systemem kryptograficznym, w którym klucze szyfrowania i deszyfrowania różnią się.
Algorytm RSA został opublikowany w 1977 roku w czasopiśmie Scientific American i opiera się na wcześniejszych pracach Whitfielda Diffiego i Martina Hellmana nad kryptografią z kluczem publicznym. Massachusetts Institute of Technology uzyskał patent na RSA w 1983 roku, który obowiązywał do 2000 roku. Według raportu RSA Laboratories (2023), algorytm pozostaje jednym z najbardziej rozpowszechnionych standardów kryptograficznych na świecie — jest używany w miliardach urządzeń codziennie.
W przeciwieństwie do szyfrów symetrycznych, gdzie ten sam klucz jest używany zarówno do szyfrowania, jak i deszyfrowania, RSA operuje matematycznie powiązaną parą kluczy. Klucz publiczny może być opublikowany dla wszystkich bez ryzyka kompromitacji systemu. Klucz prywatny jest znany tylko właścicielowi i nigdy nie jest przesyłany przez sieć. Według badania IBM Security X-Force Threat Intelligence Index (2024), szyfrowanie asymetryczne jest używane w 96% nowoczesnych protokołów bezpiecznego przesyłania danych.
Bezpieczeństwo RSA opiera się na problemie faktoryzacji — rozkładzie iloczynu dwóch dużych liczb pierwszych na czynniki. Jeśli wybrać liczby pierwsze p i q o długości 1024 bitów każda, to ich iloczyn n będzie miał 2048 bitów. Obliczenie p i q znając tylko n nowoczesnymi metodami jest praktycznie niemożliwe: według oceny ekspertów CNRS (2024), złamanie RSA-2048 wymagałoby ponad 300 miliardów lat obliczeń na klasycznym komputerze.
Przyjrzyjmy się pełnemu cyklowi działania RSA od generowania kluczy po szyfrowanie i deszyfrowanie wiadomości. Zrozumienie tych etapów jest niezbędne do poprawnej implementacji algorytmu w aplikacjach mobilnych.
Proces rozpoczyna się od wyboru dwóch dużych liczb pierwszych p i q. Oblicza się moduł n = p x q, który określa długość klucza. Następnie oblicza się funkcję Eulera phi(n) = (p-1)(q-1). Wybiera się wykładnik publiczny e, względnie pierwszy z phi(n). Wykładnik prywatny d jest obliczany jako odwrotność multiplikatywna e modulo phi(n). Według NIST SP 800-56B Rev. 2, minimalna długość n powinna wynosić 2048 bitów dla zapewnienia odpowiedniej ochrony.
import java.security.KeyPairGenerator;
import java.security.KeyPair;
import java.security.SecureRandom;
public class RSAKeyGenerator {
public static KeyPair generateKeyPair() throws Exception {
KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA");
generator.initialize(2048, new SecureRandom());
return generator.generateKeyPair();
}
}
Aby zaszyfrować wiadomość m, nadawca przekształca ją na liczbę całkowitą mniejszą od n i oblicza szyfrogram c = m^e mod n. Odbiorca używa klucza prywatnego d do odzyskania oryginalnej wiadomości: m = c^d mod n. Należy zauważyć, że RSA nie jest przeznaczony do szyfrowania dużych ilości danych ze względu na niską wydajność — maksymalny rozmiar wiadomości jest równy długości klucza minus bajty pomocnicze (około 190 bajtów dla RSA-2048 z OAEP).
import javax.crypto.Cipher;
import java.security.PublicKey;
import java.util.Base64;
public class RSAEncryptor {
public static String encrypt(String data, PublicKey publicKey) throws Exception {
Cipher cipher = Cipher.getInstance("RSA/ECB/OAEPWithSHA-256AndMGF1Padding");
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
byte[] encrypted = cipher.doFinal(data.getBytes());
return Base64.getEncoder().encodeToString(encrypted);
}
}
RSA jest również używany do tworzenia podpisów cyfrowych — mechanizmu weryfikacji autentyczności i integralności danych. Właściciel podpisuje skrót wiadomości swoim kluczem prywatnym, a każda zainteresowana osoba może zweryfikować podpis za pomocą klucza publicznego. Według raportu Sectigo Certificate Transparency (2025), ponad 85% certyfikatów TLS w Internecie używa RSA do podpisu cyfrowego, co czyni algorytm podstawą zaufania komunikacji sieciowej.
import java.security.Signature
fun signData(data: ByteArray, privateKey: java.security.PrivateKey): ByteArray {
val signature = Signature.getInstance("SHA256withRSA")
signature.initSign(privateKey)
signature.update(data)
return signature.sign()
}
fun verifySignature(
data: ByteArray, signedData: ByteArray, publicKey: java.security.PublicKey
): Boolean {
val signature = Signature.getInstance("SHA256withRSA")
signature.initVerify(publicKey)
signature.update(data)
return signature.verify(signedData)
}
Długość klucza bezpośrednio wpływa na siłę kryptograficzną RSA. Wraz ze wzrostem mocy obliczeniowych minimalny dopuszczalny rozmiar klucza jest regularnie aktualizowany przez międzynarodowe organizacje normalizacyjne. Przyjrzyjmy się obecnym zaleceniom NIST i innych regulatorów.
| Długość klucza | Odpowiednik symetryczny | Status |
|---|---|---|
| 1024 bity | 80 bitów | Zakazany od 2023 roku |
| 2048 bitów | 112 bitów | Minimalny standard |
| 3072 bity | 128 bitów | Zalecany dla nowych systemów |
| 4096 bitów | 256 bitów | Dla danych poufnych |
Zwiększenie długości klucza RSA znacząco wpływa na czas wykonywania operacji. Generowanie klucza o długości 4096 bitów zajmuje około 10 razy więcej czasu niż 2048 bitów. Operacje szyfrowania i deszyfrowania z długim kluczem wymagają więcej zasobów obliczeniowych, co jest krytyczne dla urządzeń mobilnych z ograniczonym zużyciem energii.
Wraz z rozwojem obliczeń kwantowych RSA może zostać złamany za pomocą algorytmu Shora w czasie wielomianowym. Algorytm ten, zaproponowany przez Petera Shora w 1994 roku, pozwala na faktoryzację dużych liczb w czasie O((log n)^3) operacji. Według IBM Quantum Roadmap (2025), praktyczne złamanie RSA-2048 oczekiwane jest nie wcześniej niż 2035 rok, jednak NIST już zaleca stopniowe przejście na algorytmy postkwantowe CRYSTALS-Kyber i CRYSTALS-Dilithium.
RSA jest aktywnie wykorzystywany w aplikacjach mobilnych do zapewnienia bezpiecznego przesyłania danych, weryfikacji autentyczności serwerów i ochrony transakcji cyfrowych. Integracja odbywa się poprzez standardowe API kryptograficzne obu głównych platform.
Platforma Android udostępnia Android Keystore — systemowe repozytorium kluczy kryptograficznych zabezpieczone na poziomie sprzętowym przez Trusted Execution Environment. Klucze RSA wygenerowane w KeyStore nie mogą zostać wyodrębnione z urządzenia nawet w przypadku kompromitacji aplikacji. Zapewnia to ochronę przed szeroką klasą ataków, w tym malware z dostępem root.
import android.security.keystore.KeyGenParameterSpec
import android.security.keystore.KeyProperties
import java.security.KeyPairGenerator
fun generateKeyInAndroidKeystore() {
val generator = KeyPairGenerator.getInstance(
KeyProperties.KEY_ALGORITHM_RSA,
"AndroidKeyStore"
)
val spec = KeyGenParameterSpec.Builder(
"rsa_key_pair",
KeyProperties.PURPOSE_ENCRYPT or KeyProperties.PURPOSE_DECRYPT
)
.setKeySize(2048)
.setBlockModes(KeyProperties.BLOCK_MODE_ECB)
.setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_RSA_OAEP)
.build()
generator.initialize(spec)
val keyPair = generator.generateKeyPair()
}
W iOS do pracy z RSA używany jest Security Framework z dostępem do Secure Enclave na urządzeniach z układem A7 i nowszym. Secure Enclave to dedykowany koprocesor odizolowany od głównego procesora, który wykonuje operacje kryptograficzne i przechowuje klucze w sprzętowej enklawie. Klucze RSA mogą być generowane zarówno wewnątrz Secure Enclave, jak i w programowym Keychain z różnymi poziomami dostępu.
W rzeczywistych aplikacjach mobilnych RSA rzadko jest używany do bezpośredniego szyfrowania dużych danych. Standardową praktyką jest schemat hybrydowy: aplikacja generuje klucz sesyjny AES, szyfruje go kluczem publicznym RSA serwera i wysyła na serwer. Cały następny ruch jest szyfrowany AES, co jest 100–1000 razy szybsze niż bezpośrednie przesyłanie danych przez RSA.
Jak każdy algorytm kryptograficzny, RSA ma mocne i słabe strony, które należy uwzględnić przy projektowaniu bezpiecznych systemów. Obiektywna ocena pomaga wybrać właściwe narzędzie do konkretnego zadania.
Główną zaletą RSA jest rozwiązanie fundamentalnego problemu dystrybucji kluczy — klucz publiczny można swobodnie publikować bez ryzyka kompromitacji całego systemu. Uniwersalność algorytmu przejawia się w obsłudze zarówno szyfrowania, jak i podpisu cyfrowego tą samą parą kluczy. Ponadto RSA ma rozległy ekosystem wsparcia: biblioteki są dostępne dla wszystkich języków i platform.
Główną wadą RSA jest niska wydajność w porównaniu z algorytmami symetrycznymi. Deszyfrowanie RSA-2048 na nowoczesnym procesorze mobilnym zajmuje około 5–15 milisekund, podczas gdy AES-256 przetwarza gigabajty danych w tym samym czasie. Ponadto RSA jest podatny na ataki kwantowe za pomocą algorytmu Shora, co ogranicza jego zastosowanie w systemach z długoterminowym okresem ochrony danych.
Dla projektów mobilnych eksperci NIST zalecają: używaj RSA tylko do szyfrowania kluczy i podpisów cyfrowych, wybieraj długość klucza nie mniejszą niż 3072 bity dla nowych projektów, łącz RSA z AES w schemacie hybrydowym i śledź rozwój standardów postkwantowych w celu planowej migracji w długoterminowej perspektywie.
Często zadawane pytania
RSA — algorytm asymetryczny z parą kluczy używany do szyfrowania małych ilości danych i podpisów cyfrowych. AES — algorytm symetryczny z jednym wspólnym kluczem, działający 100–1000 razy szybciej niż RSA. W nowoczesnych systemach są one łączone: RSA zabezpiecza przesyłanie klucza sesyjnego AES, a AES szyfruje główny ruch.
Minimalnym bezpiecznym rozmiarem od 2023 roku jest RSA-2048 zgodnie z NIST SP 800-131A Rev. 2. Klucze 1024 bitów są oficjalnie zakazane dla systemów rządowych USA. Dla nowych projektów zaleca się 3072 bity, co zapewnia margines bezpieczeństwa i równoważną odporność 128-bitowemu szyfrowaniu symetrycznemu.
Tak, RSA jest szeroko stosowany w aplikacjach mobilnych. Android udostępnia Android KeyStore do sprzętowego generowania i bezpiecznego przechowywania kluczy RSA. iOS — Security Framework z obsługą Secure Enclave. Do szyfrowania dużych danych zaleca się schemat hybrydowy RSA + AES, gdzie RSA szyfruje tylko klucz sesyjny.
Na klasycznych komputerach złamanie RSA-2048 jest praktycznie niemożliwe — według obecnych szacunków wymagałoby to ponad 300 miliardów lat ciągłych obliczeń. Jednak komputer kwantowy z wystarczającą liczbą kubitów będzie w stanie złamać RSA-2048 w kilka minut za pomocą algorytmu Shora. Według szacunków IBM, taki komputer pojawi się nie wcześniej niż 2035 roku.
Wśród algorytmów asymetrycznych popularne są ECC (Elliptic Curve Cryptography), zapewniający równoważne bezpieczeństwo przy mniejszej długości klucza — 256-bitowy ECC jest równoważny RSA-3072. Dla ery postkwantowej NIST wybrał CRYSTALS-Kyber do szyfrowania i CRYSTALS-Dilithium do podpisów cyfrowych w 2024 roku.
Podsumowanie
Opracujemy aplikację mobilną pod klucz
IT Sectr tworzy aplikacje na iOS i Androida dla startupów i firm od 2017 roku. Doradzimy Ci i zaproponujemy najlepsze rozwiązanie.