Zakaj vaše sporočilo ni brez skrivnosti
Praštevila, modularna aritmetika in umetnost šifriranja.
Vsakič, ko v brskalnik vpišete geslo, nakupujete prek spleta ali pišete šifrirana sporočila, deluje v ozadju matematični čudež: algoritem RSA. Imenovan po svojih ustvarjalcih Rivestu, Shamirju in Adlemanu, je bil leta 1977 prva praktična izvedba kriptografije z javnim ključem.
Bistvo RSA je presenetljivo preprosto: dve praštevili je enostavno pomnožiti, toda produkt je nadvse težko razstaviti nazaj. Na tej asimetriji počiva varnost večine sodobne digitalne komunikacije.
To potovanje vas bo vodilo od temeljev — modularne aritmetike in praštevil — prek Evklidovega algoritma in Eulerjevega izreka vse do živega šifriranja in dešifriranja. Vse matematično izpeljano, vse interaktivno.
Skrivni jezik
Od Cezarjeve šifre do matematičnega čudeža.
Predznanje: Nič posebnega — le radovednost.
Odkod izvira kriptografija? Vsaj že iz antičnega Rima. Julij Cezar je sporočila šifriral z enostavnim premikom: vsako črko je zamenjal s tisto, ki je v abecedi za tri mesta naprej. A je postala D, B je postala E in tako dalje. Kdor ni poznal zamika, ni mogel brati.
Vnesite besedilo in premikajte zamik.
Šifrirano:
Cezarjeva šifra je simetrična: isti ključ (zamik) se uporablja za šifriranje in dešifriranje. Kogar šifre naučite, ta lahko prebere vsa vaša sporočila. Tisoč let pozneje je bil ta problem rešen z revolucionarno idejo.
Problem izmenjave ključev
Predstavljajte si, da hočete poslati šifrirano sporočilo nekomu, ki ga še nikoli niste srečali — recimo spletni trgovini. Simetričnega ključa jima ne morete poslati, ne da bi ga kdo drugega prestegel. Ta gordijski vozel so razrešili šele leta 1976 Diffie, Hellman in Merkle z idejo kriptografije z javnim ključem.
V sistemu z javnim ključem ima vsak uporabnik par ključev: javni ključ, ki ga razkrije vsem, in zasebni ključ, ki ga skrbno varuje. Kdorkoli želi poslati šifrirano sporočilo, ga zaklene z javnim ključem — in le lastnik zasebnega ključa ga zna odkleniti. Nihče drug, niti pošiljatelj.
Zakaj RSA deluje?
RSA sloni na eni od najglobljih odprtih matematičnih asimetrij: množenje je enostavno, faktorizacija je težka.
Vsa matematika, ki jo bomo spoznali — modularna aritmetika, Eulerjeva funkcija, Evklidov algoritem — služi enemu cilju: izkoristiti to asimetrijo, da naredimo ključ, ki ga je enostavno ustvariti, a nemogoče ukrasti.
Modularna aritmetika
Matematika, ki se zavije — kot ura.
Predznanje: Osnovno seštevanje in deljenje.
Modularna aritmetika je matematika ostankov. Ko delimo 17 s 5, dobimo ostanek 2: 17 mod 5 = 2. Poznate jo iz vsakdanjega življenja: ura deluje po modulu 12. Ob 9:00 uri dodamo 5 ur in dobimo 14:00 — kar na uri kaže 2. Rečemo: 9 + 5 ≡ 2 (mod 12).
Kongruenca
Dve števili sta kongruentni po modulu m, če imata enak ostanek pri deljenju z m. Pišemo:
natanko tedaj, ko m | (a − b)
Na primer: 17 ≡ 2 (mod 5), ker je 17 − 2 = 15 deljivo s 5. Prav tako: 22 ≡ 2 (mod 5), −3 ≡ 2 (mod 5). Vsa ta števila sodijo v isto razred kongruence.
Modularna potenčevanja
V RSA je ključna operacija modularna potenčevanost: izračunamo ae mod n. Navzven deluje kot navadna potenčevanost, potem pa vzamemo ostanek. Npr. 3⁵ mod 7 = 243 mod 7 = 5.
Opazujte vzorce: rezultati modularne potenčevanosti so navidez kaotični — in to je prav tisto, kar jo naredi varno za kriptografijo. Nihče ne more predvideti rezultata brez poznavanja vseh parametrov.
Globlje: Hitro modulaarno potencevanje ★★
V RSA računamo ae mod n, kjer je e število z več sto ciframi. Naivno množenje bi trajalo astronomično dolgo. Algoritem hitrega potencevanja (ang. square-and-multiply) to reši: eksponent e zapišemo v dvojiški obliki in pri vsakem bitu le kvadriramo ali kvadriramo in množimo. Namesto e množenj naredimo le log₂(e) korakov.
Na primer za a⁸: namesto a×a×a×a×a×a×a×a (7 množenj) naredimo: a² = a×a, a⁴ = a²×a², a⁸ = a⁴×a⁴ (3 množenja). Za e = 10²⁰⁰ namesto 10²⁰⁰ množenj naredimo le ~660.
a mod m je ostanek pri deljenju a z m. Dve števili sta kongruentni (mod m), če imata enak ostanek. Modularna potenčevanost ae mod n je temeljna operacija RSA — enostavna v eno smer, navidez nepredvidljiva brez ključa.
Praštevila
Atomarni gradniki vseh celih števil.
Predznanje: 2. poglavje (modularna aritmetika).
Praštevilo je naravno število, večje od 1, ki je deljivo le s seboj in z 1: 2, 3, 5, 7, 11, 13, … Vsako celo število se enolično zapiše kot produkt praštevil — to je osnovni izrek aritmetike. Praštevila so torej atomarni gradniki matematike.
Eratostenovo sito
Najstarejši algoritem za iskanje praštevil izvira iz antične Grčije. Začnemo z vsemi števili od 2 do n in sistematično izbrišemo vse večkratnike vsakega praštevila.
Pritiskajte gumb za vsak korak sita. Rumena = trenutno praštevilo, siva = prekrižana.
Distribucija praštevil
Praštevila postajajo redkejša, ko naraščamo po številski premici — toda nikoli ne prenehajo. Euklid je to dokazal pred več kot 2300 leti z elegantnim dokazom s protislovjem. Poleg tega velja izrek o praštevilu: praštevil do n je okrog n / ln(n).
Zakaj sta dve praštevili ključ
V RSA izberemo dve veliki praštevili p in q (dandanes vsako z več sto ciframi) in ju pomnožimo: n = p × q. Vrednost n, ki jo imenujemo modul, postane del javnega ključa. Nihče ne more enostavno ugotoviti, kateri sta bili p in q — in prav to nezmožnost izkoriščamo.
Izberite dve praštevili (za učne namene so majhna). Dejanski RSA uporablja 1024–4096-bitna praštevila.
Globlje: Testiranje praštevil v RSA ★★
V praksi praštevil ne iščemo z Eratostenovim sitom (preveč počasno za 1024-bitna števila). Namesto tega uporabimo verjetnostne teste praštevil, npr. Miller-Rabinov test. Ta test z visoko verjetnostjo zazna, ali je število sestavljeno, a ne jamči absolutne praštevilnosti.
Postopek: naključno izberemo veliko naravno število n, preizkusimo z Miller-Rabinovim testom 40-krat z različnimi bazami — verjetnost, da bi sestavljeno število prestalo vse teste, je manjša od 4⁻⁴⁰ ≈ 10⁻²⁴. V praksi to zadostuje.
Evklidov algoritem
Najstarejši algoritem v zgodovini računalništva.
Predznanje: 3. poglavje.
Evklidov algoritem, opisan v Elementih okrog leta 300 pr. n. št., izračuna največji skupni delitelj (NSD ali gcd) dveh naravnih števil. V RSA ga potrebujemo za dve nalogi: preveriti, ali sta dve števili tuji (gcd = 1), in izračunati inverz po modulu.
Navadni Evklidov algoritem
Ideja je preprosta: gcd(a, b) = gcd(b, a mod b). Večje število nadomestimo z ostankom in ponavljamo, dokler ostanek ni nič.
Razširjeni Evklidov algoritem
Razširjena oblika ne le najde gcd, temveč poišče tudi celi števili s in t, za kateri velja Bézoutova identiteta:
Ko je gcd(e, φ(n)) = 1, razširjeni Evklidov algoritem poišče inverz e po modulu φ(n). To je zasebni ključ d v RSA!
Iščemo s in t, da velja s·a + t·b = gcd(a,b).
Globlje: Zakaj Bézoutova identiteta da inverz? ★★
Ko je gcd(e, m) = 1, velja: obstajata s, t, da je s·e + t·m = 1. Oba strani vzamemo modulo m: s·e ≡ 1 (mod m). Torej je s ravno inverz e po modulu m, ki ga pišemo e⁻¹ mod m.
V RSA je ta inverz zasebni ključ d: d·e ≡ 1 (mod φ(n)). Ko šifriramo s e in dešifriramo z d, se potenci »razveljavita« ravno zato, ker je njun produkt kongruenten 1 po modulu φ(n).
Eulerjeva funkcija φ
Štetje »sovitih« — in zakaj to zaklene RSA.
Predznanje: 4. poglavje.
Eulerjeva funkcija φ(n) (beremo »fi od n«) šteje, koliko naravnih števil od 1 do n je sotujih (oz. sovitih) z n — torej koliko jih z n nima skupnega delitelja razen 1. Pravimo: gcd(k, n) = 1.
Vizualizacija φ(n)
Izberite n. Modra polja so sovita z n, siva niso.
Lastnosti φ za RSA
Za RSA sta ključni dve lastnosti:
- Za praštevilo p: φ(p) = p − 1 (vsa števila od 1 do p−1 so sovita s p)
- Za produkt dveh praštevil: φ(p·q) = (p−1)·(q−1)
Eulerjev izrek
Ključni izrek, ki naredi RSA možno:
za vsak a, ki je sovit z n
To pomeni: če potenčevamo a s φ(n), se vrnemo k 1 po modulu n. In ker je d·e ≡ 1 (mod φ(n)), velja:
Šifriran in dešifriran M se vrne k izvornemu sporočilu!
Preverite: aφ(n) mod n = 1 (za sovita a in n).
Globlje: Fermatov mali izrek ★★
Eulerjev izrek je posplošitev Fermatovega malega izreka (1640): za praštevilo p in gcd(a, p) = 1 velja ap−1 ≡ 1 (mod p). Ker je φ(p) = p−1, je Fermatov izrek poseben primer Eulerjevega.
V RSA, kjer je n = p·q, se zato pri dešifriranju res vrne izvorno sporočilo: (Me)d = Me·d ≡ M1 + k·(p−1)·(q−1) ≡ M (mod n), kar sledi iz Fermatovega izreka za oba faktorja in kitajskega izreka o ostankih.
Gradnja ključev RSA
Vse sestavine skupaj — od praštevil do ključa.
Predznanje: 5. poglavje.
Zdaj poznamo vse sestavine. Sledite generiranju RSA ključev korak za korakom. Vsak korak razkrinkamo z dejanskimi izračuni — le z manjšimi števili za nazornost.
Izberite dve praštevili p in q, nato pritisnite gumb za generiranje ključa.
Globlje: Zakaj je e = 65537 tako priljubljen? ★★
V resničnih sistemih RSA je e pogosto kar 65537 (= 2¹⁶ + 1). Razlog je dvojen: prvič, 65537 je praštevilo (torej je gcd(65537, φ(n)) verjetno 1), in drugič, v dvojiškem zapisu je videti kot 10000000000000001 — kar pomeni, da ima pri hitrem potencevanju le dve 1-bitni poziciji in je računanje Me mod n izjemno hitro (le 17 korakov).
Majhna vrednost e pospeši šifriranje (ki ga opravlja pošiljatelj), dešifriranje z d pa je vedno počasnejše — a to opravi le prejemnik enkrat.
Javni in zasebni ključ
Po generiranju imate:
- Javni ključ (e, n): razdelite ga vsem. Kdorkoli šifrira z njim.
- Zasebni ključ (d, n): strogo zasebno. Le vi dešifrirate.
- p, q, φ(n): tajnost — ko sta generirana, ju ni treba hraniti.
Šifriranje in dešifriranje
RSA v živo — pošljite sporočilo.
Predznanje: 6. poglavje.
Zdaj pride najlepši del: dejansko šifriranje. V RSA sta operaciji preprosti:
Sporočilo M mora biti naravno število, ki je manjše od n. Ko šifriramo besedilo, vsak znak pretvorimo v njegovo ASCII vrednost in ga posebej šifriramo.
Korak 1 — Ključni par
Korak 2 — Sporočilo
Korak 3 — Dešifriranje
Vsak znak besedila posebej šifriramo (RSA blokovna šifra). Razvaljavnost je matematično zagotovljena.
Globlje: Zakaj v praksi ne šifriramo neposredno z RSA? ★★★
RSA je v praksi prepočasen za šifriranje dolgih sporočil. Namesto tega se RSA uporablja za izmenjavo ključa: z RSA šifriramo kratki naključni ključ (npr. 256-bitni AES ključ), nato pa celotno sporočilo šifriramo s tem simetričnim ključem. Ta hibridni pristop je osnova HTTPS, TLS in PGP.
Poleg tega gola RSA šifra (brez oblazinjenja) ni varna: isti M vedno da isti C, kar napadalec izkoristi. Zato se v praksi uporablja RSA-OAEP (Optimal Asymmetric Encryption Padding), ki pred šifriranjem M naključno »oblazini«.
Varnost RSA
Zakaj faktorizacija boli — in kaj prinese jutri.
Predznanje: Priporočljivo celotno potovanje.
Varnost RSA stoji in pade z enim vprašanjem: Kako težko je razstaviti n = p·q? Dokler ni znano nobenega učinkovitega klasičnega algoritma za ta problem, je RSA varen.
Kompleksnost faktorizacije
Najboljši znani klasični algoritem za faktorizacijo je generalizirano sito naključnih kvadratov (GNFS). Njegova časovna zahtevnost je subeksponentna, a vseeno astronomska za dovolj velika n:
Interaktivni faktorizator
Za majhna n lahko faktoriziramo neposredno. Za razliko od RSA (praštevili z isto velikostjo) je faktorizacija n enostavna, ko sta p in q majhni.
Kvantni računalniki in Shorjev algoritem
Leta 1994 je Peter Shor dokazal, da bi kvantni računalnik znal faktorizirati n v polinomskem času — kar bi RSA takoj zlomilo. Shorov algoritem s kvantnimi vrati izkoristi kvantno superpozicijo za iskanje periodičnosti, ki je osnova faktorizacije.
Post-kvantna kriptografija
NIST (ameriški Nacionalni inštitut za standarde) je leta 2024 standardiziral prve post-kvantne kriptografske algoritme: CRYSTALS-Kyber (za izmenjavo ključev) in CRYSTALS-Dilithium (za digitalne podpise). Ti temeljijo na matematičnih problemih z rešetkami (lattice-based cryptography), za katere trenutno ni znanih niti klasičnih niti kvantnih učinkovitih algoritmov.
Sodobna RSA in priporočene dolžine ključev
| Dolžina ključa | Varnost | Primernost |
|---|---|---|
| 512 bitov | Zlomljeno | Ne uporabljajte |
| 1024 bitov | Nezadostno | Zastarelo od 2010 |
| 2048 bitov | Sprejemljivo | Minimalni standard 2025 |
| 4096 bitov | Priporočeno | Dolgoročna zaščita |
Globlje: Zakaj Shorjev algoritem deluje? ★★★
Faktorizacija n se pretvori v iskanje periodičnosti: poiščemo periodo r funkcije f(k) = ak mod n. Ko poznamo r (in je r sodo), je z verjetnostjo ≥ 1/2 eden od gcd(ar/2 ± 1, n) netrivialni faktor n.
Klasično iskanje periode terja eksponentni čas. Kvantni algoritem QFT (Quantum Fourier Transform) najde periodo v polinomskem času z izkoriščanjem kvantne interference. Za faktorizacijo 2048-bitnega n bi potrebovali ~4000 logičnih kubitov — dandanes imamo le nekajsto šumnih.