Asimetrična Kriptografija
Zašto postoji asimetrična kriptografija?
U simetričnoj kriptografiji isti ključ se koristi i za šifrovanje i za dešifrovanje. Problem nastaje kada dve strane žele da komuniciraju, a nikada nisu razmenjivale ključ na bezbedan način. Kako se dogovoriti o tajnom ključu kada je kanal komunikacije nesiguran?
Asimetrična kriptografija rešava ovaj problem uvođenjem para ključeva:
-
Javni ključ — može se slobodno deliti sa svima
-
Privatni ključ — čuva ga samo vlasnik, nikad se ne deli
Poruka šifrovana javnim ključem može se dešifrovati samo odgovarajućim privatnim ključem, i obrnuto. Ovaj princip omogućava bezbednu komunikaciju između strana koje se nikada nisu srele.
Massey–Omura protokol (idejno)
Massey–Omura je jedan od prvih protokola koji demonstrira kako dve strane mogu razmeniti poruku bez zajedničkog ključa, koristeći ideju „katanaca bez ključa":
- Alisa zaključava poruku svojim katancem i šalje Bobanu.
- Boban dodaje i svoj katanac — šalje nazad Alisi.
- Alisa skida svoj katanac — šalje Bobanu.
- Boban skida samo još njegov katanac i čita poruku.
Niko na mreži nikad nije video poruku bez bar jednog katanca. U praksi se ovo realizuje modularnim stepenovanem, ali RSA i Diffie–Hellman su modernija i praktičnija rešenja.
Malo matematike
Rastavljanje na faktore — osnova RSA
Množenje dva velika prosta broja je lako:
Međutim, polazeci od n naći p i q nazad je izuzetno teško (za dovoljno velike brojeve). Ovo je matematička osnova RSA algoritma — asimetrija između lakše i teže operacije.
RSA
Šta je RSA i kako radi?
RSA (Rivest–Shamir–Adleman, 1977) je najrasprostranjeniji asimetrični algoritam. Bezbednost mu se zasniva na teškoći rastavljanja velikog broja na proste faktore.
Generisanje ključeva — korak po korak
1. Odaberi dva prosta broja: p, q
2. Izračunaj: n = p × q
3. Izračunaj Eulerovu funkciju: φ(n) = (p−1)(q−1)
4. Odaberi javni eksponent e: 1 < e < φ(n), gcd(e, φ(n)) = 1
5. Izračunaj privatni eksponent d: d × e ≡ 1 (mod φ(n))
| Vrednost | Uloga |
|---|---|
(n, e) |
Javni ključ |
(n, d) |
Privatni ključ |
p, q |
Tajni parametri (bacaju se nakon generisanja) |
Šifrovanje i dešifrovanje
Jednostavan primer: p = 5, q = 11
p = 5, q = 11
n = 5 × 11 = 55
φ(n) = (5−1)(11−1) = 4 × 10 = 40
Biramo e = 3 tako da važi gcd(e, 40) = 1
Tražimo d tako da: 3 × d ≡ 1 (mod 40)
→ d = 27 (jer 3 × 27 = 81 = 2×40 + 1)
Javni ključ: (n=55, e=3)
Privatni ključ: (n=55, d=27)
Šifrujemo poruku M = 2:
C = 2^3 mod 55 = 8
Dešifrujemo:
M = 8^27 mod 55 = 2
PEM fajlovi
RSA ključevi se čuvaju u .pem (Privacy Enhanced Mail) fajlovima. Postoje dve vrste:
Privatni ključ (private_key.pem):
-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAAKCAQEA2a2rwplBQLzHPZe5RJr9vFqnMn3EnEaqJ7W2yGH9uGFTIGiL
...
-----END RSA PRIVATE KEY-----
Javni ključ (public_key.pem):
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2a2rwplBQLzHPZe5RJr9
...
-----END PUBLIC KEY-----
Sadržaj je Base64-enkodovani ASN.1/DER format koji sadrži sve parametre.
Pregled detalja iz PEM fajlova
Generisanje i inspekcija ključa u terminalu:
# Generisanje RSA ključa (2048 bita)
openssl genrsa -out private_key.pem 2048
# Prikaz internih parametara (p, q, n, e, d, ...)
openssl rsa -in private_key.pem -text -noout
Izlaz prikazuje:
Private-Key: (2048 bit, 2 primes)
modulus (n): 00:d6:9a:5f:... (256 bajta)
publicExponent (e): 65537 (0x10001)
privateExponent (d): 1a:3b:7c:...
prime1 (p): 00:f3:1a:...
prime2 (q): 00:e1:09:...
exponent1: d mod (p-1)
exponent2: d mod (q-1)
coefficient: q^(-1) mod p
Napomena:
e = 65537je standardni izbor.
Problem diskretnog logaritma
Ako znamo g, p i rezultat A:
a je računarski neizvodljivo za dovoljno velike p. Ovo je osnova Diffie–Hellman i ElGamal algoritama.
Razmena ključeva — Diffie–Hellman (DH)
DH omogućava da dve strane izvedu zajednički tajni ključ kroz nesiguran kanal, bez da ključ ikad bude eksplicitno prenet.
# GLOBALNI PARAMETRI (javni, svi ih znaju):
p = veliki_prost_broj # npr. 2048-bitni prost broj
g = generator # primitivni koren mod p
# ALISA:
a = random() # privatni ključ (čuva za sebe)
A = pow(g, a, p) # javni ključ = g^a mod p
# BOBAN:
b = random() # privatni ključ (čuva za sebe)
B = pow(g, b, p) # javni ključ = g^b mod p
# RAZMENA (javnim kanalom):
Alisa --> A --> Boban
Boban --> B --> Alisa
# IZRAČUNAVANJE ZAJEDNIČKE TAJNE:
Alice: shared = pow(B, a, p) # = (g^b)^a mod p = g^(ab) mod p
Bob: shared = pow(A, b, p) # = (g^a)^b mod p = g^(ab) mod p
# REZULTAT:
zajednicki_kljuc = g^(a*b) mod p # identičan s obe strane
Napadač vidi g, p, A, B — ali ne može lako naći a ili b (problem diskretnog logaritma).
DH sam po sebi ne autentifikuje strane — podložan je Man-in-the-Middle napadu bez sertifikata.
Šifrovanje — ElGamal (osnovno)
ElGamal je sistem šifrovanja zasnovan na DH principu:
Generisanje ključeva:
Javni: (p, g, A) gde A = g^a mod p
Privatni: a
Šifrovanje poruke M:
Bira slučajno k
C1 = g^k mod p
C2 = M × A^k mod p
Šifrat = (C1, C2)
Dešifrovanje:
M = C2 × (C1^a)^(-1) mod p
Eliptičke krive
Jednačina
Eliptička kriva u Weierstrassovom obliku:
Za kriptografiju se koriste krive nad konačnim poljima (skupovi tačaka imaju konačan broj elemenata).
Sabiranje tačaka
Sabiranje dve tačke P i Q na eliptičkoj krivi:
- Povuče se prava kroz P i Q
- Presek prave sa krivom daje tačku R'
- R = refleksija R' po x-osi je rezultat:
P + Q = R
Dupliranje tačke
Ako P = Q, povlači se tangenta na krivu u tački P, a postupak refleksije ostaje isti: P + P = 2P.
Diskretni logaritam na eliptičkim krivama (ECDLP)
Analogija sa DH:
k·G znači G sabran sa samim sobom k puta (skalarna multiplikacija).
Glavna prednost ECC
| Algoritam | Dužina ključa | Sigurnosni nivo |
|---|---|---|
| RSA | 1024 bita | ~80 bita |
| RSA | 2048 bita | ~112 bita |
| ECC | 160 bita | ~80 bita |
| ECC | 256 bita | ~128 bita |
160-bitni ECC ključ nudi istu sigurnost kao 1024-bitni RSA ključ — uz znatno manje memorije, brže operacije i manju potrošnju energije. Zbog toga ECC dominira na mobilnim uređajima i IoT.
Digitalni potpisi
Princip rada
POTPISIVANJE:
1. poruka → [hash funkcija] → hes (npr. SHA-256)
2. hes → [šifrovanje privatnim ključem] → potpis
3. šalje se: poruka + potpis
VERIFIKACIJA:
1. primljena poruka → [hash funkcija] → hes₁
2. potpis → [dešifrovanje javnim ključem] → hes₂
3. hes₁ == hes₂ → potpis validan ✓
Osobine digitalnih potpisa
- Autentičnost — samo vlasnik privatnog ključa može kreirati validan potpis
- Integritet — svaka promena poruke narušava potpis
- Neporecivost — potpisnik ne može tvrditi da nije potpisao
- Vezanost za poruku — potpis se ne može odvojiti i koristiti uz drugu poruku
Sign-then-Encrypt vs Encrypt-then-Sign
Sign-then-Encrypt (preporučeno)
- Štiti identitet pošiljaoca (potpis je unutar šifrata)
- Primalac prvo dešifruje, pa verifikuje potpis
- Smatra se sigurnijim pristupom
Encrypt-then-Sign
- Potpis je vidljiv bez dešifrovanja
- Primalac može verifikovati autentičnost pre dešifrovanja
- Korisno u nekim specifičnim scenarijima
Sertifikati i Certificate Authority (CA)
Man-in-the-Middle napad
Bez sertifikata, napadač može presresti DH razmenu:
Alisa ←→ [NAPADAČ] ←→ Boban
Alisa misli da komunicira sa Bobanom.
Boban misli da komunicira sa Alisom.
Napadač vidi sve — u oba smera.
Šta sadrži sertifikat?
Sertifikat je potpisani digitalni dokument koji vezuje javni ključ za identitet:
| Polje | Opis |
|---|---|
| Javni ključ | Ključ entiteta kome sertifikat pripada |
| Subjekt | Domen (npr. example.com), možda i vlasnik |
| Izdavač | Naziv CA koji je potpisao sertifikat |
| Период važenja | Not Before / Not After datumi |
| Namena | Server autentifikacija, potpisivanje koda... |
| Potpis CA | Digitalni potpis CA koji garantuje autentičnost |
Pregled realnog sertifikata
# Pregled sertifikata u sistemu
ls /etc/ssl/certs/
# Detalji konkretnog sertifikata
openssl x509 -in /etc/ssl/certs/DigiCert_Global_Root_CA.pem -text -noout
Kako funkcioniše dobijanje sertifikata
1. Server generiše par ključeva (privatni + javni)
2. Server kreira Certificate Signing Request (CSR):
openssl req -new -key private.key -out request.csr
3. CSR se šalje CA (sadrži javni ključ i podatke o domenu)
4. CA verifikuje podatke (DNS, vlasništvo domena, itd.)
5. CA potpisuje sertifikat svojim privatnim ključem
6. Sertifikat se instalira na server
7. Klijent dobija sertifikat pri TLS handshake-u
8. Klijent verifikuje potpis CA (čiji javni ključ već ima)
Lanac poverenja (Chain of Trust)
Root CA (ugrađen u OS/browser)
└── Intermediate CA (potpisan od Root CA)
└── Server sertifikat (potpisan od Intermediate CA)
Postoji svega ~50-100 Root CA sertifikata ugrađenih u operativne sisteme i browsere. Ako nijedan od njih direktno nije potpisao serverski sertifikat, browser prati lanac poverenja navise dok ne dođe do poznatog Root CA.
Opoziv sertifikata
Šta se dešava kada sertifikat koji je nekad bio validan više ne treba da važi (kompromitovan privatni ključ, promena domena...)?
CRL (Certificate Revocation List)
- CA objavljuje listu svih opozvanih sertifikata
- Klijenti periodično preuzimaju listu
- Problem: lista može biti velika, zastarela, browseri je često ignorišu
OCSP (Online Certificate Status Protocol)
- Klijent direktno pita CA: „Da li je sertifikat X validan?"
- CA vraća odgovor:
good/revoked/unknown - OCSP Stapling: Server sam pribavlja OCSP odgovor i prilaže ga uz sertifikat (smanjuje latenciju, štiti privatnost klijenta)
Vremenski pečati
Vremenski pečat dokazuje da je određeni dokument postojao u određenom trenutku.
TSA — Time Stamping Authority (centralizovano)
1. Korisnik izračuna: hes = SHA256(dokument)
2. Hes se šalje TSA serveru
3. TSA nadovezuje: token = hes || vreme || TSA_identitet
4. TSA potpisuje token svojim privatnim ključem
5. Potpisan token se vraća korisniku
Dokument se nikad ne šalje TSA-u — samo hes. TSA ne zna sadrzaj dokumenta.
Blockchain (decentralizovano)
- Hes dokumenta se upisuje u blockchain transakciju
- Nepromenjivost blockchaina garantuje da dokument nije nastao posle bloka
- Ne zahteva poverenje u centralni entitet
Onion šifrovanje (Tor)
Onion šifrovanje skriva identitet pošiljaoca kroz višeslojno šifrovanje:
Alisa želi da poseti server S kroz čvorove A, B, C:
Alisa šifruje: Enc_C( Enc_B( Enc_A( poruka ) ) )
Čvor A: dešifruje spoljni sloj → vidi samo B kao sledeći korak
Čvor B: dešifruje srednji sloj → vidi samo C kao sledeći korak
Čvor C: dešifruje unutrašnji sloj → šalje poruku serveru S
Server S vidi samo C, ne zna da je Alisa poslala poruku.
Čvor A zna da je Alisa poslala nešto, ali ne zna kome.
Nijedan čvor nema kompletnu sliku.
Cilj: Sakriti identitet korisnika i otežati praćenje komunikacije.
Koristi: Tor mreža, I2P (delimično).
Garlic šifrovanje
Proširenje onion koncepta — više poruka se pakuje zajedno:
"Garlic" paket = [ poruka₁ za primaoca X ]
[ poruka₂ za primaoca Y ] → višeslojno šifrovano
[ poruka₃ za primaoca Z ]
- Kombinovanje više poruka otežava analizu saobraćaja (ko komunicira s kim)
- Svaki čvor dešifruje samo deo koji mu je namenjen
- Komunikacija je uglavnom unutar I2P mreže (za pristup regularnom internetu manje pogodno)
Gde se koristi asimetrična kriptografija?
| Primena | Primer |
|---|---|
| Razmena ključeva | TLS handshake — DH/ECDH dogovara simetrični ključ |
| Autentifikacija servera | HTTPS sertifikati — browser verifikuje da li je server legitiman |
| Digitalni potpisi | PDF dokumenti, online ugovori, Git commit-ovi, blockchain transakcije |
| Login bez lozinke | SSH — privatni ključ na klijentu, javni na serveru |
| Vremenski pečat | TSA, blockchain notarizacija |
| Šifrovanje mejlova | PGP (Pretty Good Privacy) — Web of Trust model |
| Potpisivanje koda | App Store, Windows Driver Signing, APT paketi |
| Blockchain | Svaka transakcija potpisana privatnim ključem vlasnika |
PGP(Pretty Good Privacy) i Web of Trust
PGP koristi decentralizovani model poverenja: - Korisnici međusobno potpisuju jedni drugima javne ključeve - Poverenje se prenosi transitno: ako Alisa veruje Bobanu, a Boban je potpisao Karolin ključ, Alisa delimično veruje i Karolini - Nema centralnog autoriteta — mreža korisnika gradi poverenje
openssl ilustracije