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 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”:
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.
Množenje dva velika prosta broja je lako:
p = 982_451_653
q = 179_424_673
n = p × q = 176_284_630_799_479
Međutim, polaziti od n i 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 (Rivest–Shamir–Adleman, 1977) je najrasprostranjeniji asimetrični algoritam. Bezbednost mu počiva na teškoći rastavljanja velikog broja na proste faktore.
1. Odaberi dva prosta broja: p, q
2. Izračunaj: n = p × q
3. Izračunaj Ojlerovu 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: C = M^e mod n
Dešifrovanje: M = C^d mod n
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
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.
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 -nooutIzlaz 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 ← CRT optimizacija
Napomena:
e = 65537je standardni izbor.
Ako znamo g, p i rezultat
A:
A = g^a mod p
Pronaći a je računarski neizvodljivo za
dovoljno velike p. Ovo je osnova Diffie–Hellman i ElGamal
algoritama.
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.
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čka kriva u Weierstrassovom obliku:
y² = x³ + ax + b (mod p)
Za kriptografiju se koriste krive nad konačnim poljima (skupovi tačaka imaju konačan broj elemenata).
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
Ako P = Q, povlači se tangenta na krivu u tački P, a
postupak refleksije ostaje isti: P + P = 2P.
Analogija sa DH:
Poznato: G (bazna tačka), Q = k·G
Naći: k ← računarski neizvodljivo
k·G znači G sabran sa samim sobom k puta (skalarna
multiplikacija).
| 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.
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 ✓
Sign-then-Encrypt (preporučeno)
poruka → [potpis] → poruka+potpis → [šifrovanje] → šifrat
Encrypt-then-Sign
poruka → [šifrovanje] → šifrat → [potpis] → šifrat+potpis
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.
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 sertifikata u sistemu
ls /etc/ssl/certs/
# Detalji konkretnog sertifikata
openssl x509 -in /etc/ssl/certs/DigiCert_Global_Root_CA.pem -text -noout1. 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)
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.
Š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)
OCSP (Online Certificate Status Protocol)
good / revoked /
unknownVremenski pečat dokazuje da je određeni dokument postojao u određenom trenutku.
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.
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).
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 ]
| 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 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