Anno 5 · Modulo 2 · Lezione 7
✍ Autore: Prof. Giagnotti · Materia: Sistemi e Reti

Crittografia asimmetrica - RSA e sistemi ibridi

Dal paradosso della distribuzione delle chiavi alla rivoluzione di Diffie-Hellman, fino a RSA e ai sistemi ibridi che proteggono HTTPS, TLS e SSH ogni giorno.

⏱ 55 min 📚 Anno 5 🧠 RSA 🔐 Crittografia asimmetrica 🧪 Lab GitHub
// Obiettivi di apprendimento
✓Spiegare il problema della distribuzione delle chiavi nei sistemi simmetrici e come la crittografia asimmetrica lo risolve
✓Descrivere i requisiti di un crittosistema asimmetrico secondo Diffie-Hellman e distinguere i casi d'uso di confidenzialità e autenticazione
✓Eseguire la generazione delle chiavi RSA e calcolare cifratura/decifratura su un esempio numerico concreto
✓Spiegare il funzionamento dei crittosistemi ibridi e perché combinano crittografia asimmetrica e simmetrica

1. Il problema della distribuzione delle chiavi

📌 Definizione da ricordare

La crittografia simmetrica è efficiente ma richiede che mittente e destinatario condividano preventivamente la stessa chiave segreta su un canale sicuro — problema noto come key distribution problem.

La crittografia simmetrica è efficiente e sicura — ma ha un difetto strutturale fondamentale: mittente e destinatario devono condividere la stessa chiave segreta prima di poter comunicare. Come si scambiano questa chiave in modo sicuro su un canale non sicuro?

Ada Conosce chiave K K segreta CANALE NON SICURO Criminal intercetta! K Brian Vuole ricevere K ? K mancante Se usi canale sicuro per K, perche non usarlo per il messaggio? Paradosso strutturale.
🎯 Esempio in classe

In laboratorio: Alice deve parlare con 30 compagni usando AES. Servono 30 chiavi diverse, una per coppia, e ogni nuova persona richiede 30 nuovi scambi segreti. Se invece usi la cassetta postale pubblica (chiave pubblica), ognuno ha un lucchetto diverso e basta pubblicare i lucchetti — analogia della mailbox di Rivest.

💬 Tip del docente

Alla verifica dicono: "La crittografia simmetrica non e sicura perche la chiave viaggia in chiaro". Correggi: e sicura se la chiave resta segreta; il problema e logistico, non crittografico — si chiama distribuzione, non robustezza.

📌 Citazione Bruce Schneier (1996)

"Se l'aveste chiesto a tutti i crittografi del mondo nel 1975, vi avrebbero risposto che era impossibile cifrare un messaggio senza aver prima condiviso una chiave segreta."

2. La rivoluzione - crittografia asimmetrica

Nel 1976 Whitfield Diffie e Martin Hellman pubblicarono "New Directions in Cryptography", dimostrando teoricamente la possibilita di scambiare informazioni in modo sicuro senza mai condividere un segreto. L'anno successivo, nel 1977, Rivest, Shamir e Adleman ne fornirono la prima implementazione pratica: RSA.

🔓 Chiave Pubblica

Distribuita liberamente

Come pubblicare il numero di telefono sull'elenco. Chiunque puo cifrare messaggi per te e verificare la tua firma digitale. Non contiene informazioni per ricavare la privata.

🔐 Chiave Privata

Mai trasmessa

Come la chiave fisica di casa. Solo tu puoi decifrare messaggi cifrati con la tua pubblica e firmare digitalmente. Va custodita in HSM / keystore.

📌 Proprieta fondamentale

Un messaggio cifrato con la chiave pubblica puo essere decifrato solo con la corrispondente chiave privata — e viceversa. Nonostante le due chiavi siano matematicamente collegate, deve essere computazionalmente impossibile ricavare la privata dalla pubblica.

Requisiti di un crittosistema asimmetrico (Diffie-Hellman)

01 · FACILE

Generazione coppia

Computazionalmente facile generare una coppia pubblica/privata.

02 · FACILE

Cifratura pubblica

Cifrare con chiave pubblica deve essere facile ed efficiente.

03 · IMPOSSIBILE

Derivazione privata

Ricavare la privata dalla pubblica e computazionalmente impossibile — one-way function.

04 · FACILE TRAPDOOR

Decifratura privata

Con la trapdoor (chiave privata) la decifratura torna facile.

05 · IMPOSSIBILE

Attacco solo con pubblica

Risalire al plaintext conoscendo solo algoritmo e pubblica e impossibile.

FUNZIONE ONE-WAY TRAPDOOR Messaggio + KpubC = E(Kpub, M) facile Cifratura nel cavoAttaccante vede C, Kpubma non puo risalire a M Decifra con KprivM = D(Kpriv, C) facile Trapdoor: conoscere p,q = conosce phi(n) = calcoli d inverso, la porta segreta che rende facile cio che per altri e impossibile. Esempio fattorizzazione: n = p*q immediato, n in p,q con n a 2048 bit = impossibile classicamente. Senza trapdoor: one-way pura. Con trapdoor: one-way invertibile solo da chi ha segreto.

3. I tre scenari d'uso: confidenzialita, firma, combinato

SCENARIO 1 · CONFIDENZIALITA

Kpub destinatario

Ada cifra con Kpub di Brian -> solo Brian con Kpriv puo leggere. Usato in HTTPS request.

SCENARIO 2 · AUTENTICITA

Kpriv mittente

Brian cifra con la sua Kpriv -> chiunque verifica con Kpub di Brian. Garantisce autenticita e integrita, non segretezza. Base firma digitale.

SCENARIO 3 · ENTRAMBI

Doppia cifratura

X=C(Kpriv-Ada,T) poi Y=C(Kpub-Brian,X). Ricezione inversa: decifra e verifica.

🎯 Esempio in classe - Scenario confidenzialita

Brian pubblica Kpub su registro di classe (bacheca). Ada scrive biglietto "compito domani", lo cifra con Kpub di Brian (tool OpenSSL in lab), lo passa su banco non sicuro (Criminal = prof che intercetta). Brian decifra con Kpriv. Anche se prof fotocopia biglietto cifrato e conosce Kpub, non legge.

NOTAZIONE FORMALE · SCENARIO 3
Mittente Ada: X = C(Kpriv-Ada, T) <- firma con chiave privata di Ada (autenticita) Y = C(Kpub-Brian, X) <- cifra con chiave pubblica di Brian (confidenzialita) Invia Y sul canale Destinatario Brian: X = D(Kpriv-Brian, Y) <- decifra con chiave privata di Brian T = D(Kpub-Ada, X) <- verifica firma con chiave pubblica di Ada Nota: T = D(Kpub-Ada, D(Kpriv-Brian, C(Kpub-Brian, C(Kpriv-Ada, T)))) Solo chi ha Kpriv-Brian legge, solo chi ha Kpub-Ada verifica provenienza.
⚠️ Errore comune

Confondere ordine chiavi: per confidenzialita si usa la PUBBLICA del DESTINATARIO, non la propria. Per firma si usa la PRIVATA del MITTENTE. Dire "cifro con la mia privata per segretezza" e errato — stai firmando, non proteggendo la segretezza, perche la tua pubblica e nota a tutti.

4. L'algoritmo RSA - generazione, cifratura, esempio

📌 Definizione da ricordare

RSA basa la sua sicurezza sulla difficolta di fattorizzare n = p x q dove p e q sono primi grandi. Moltiplicare e O(1), fattorizzare un 2048 bit e computazionalmente infattibile con calcolatori classici.

FACILE

Moltiplicare p x q = n

Anche con primi di 308 cifre (1024 bit) e immediato.

DIFFICILISSIMO

Fattorizzare n -> p x q = ?

Con n a 2048 bit, tempo superiore a eta dell'universo con GNFS classico.

Generazione delle chiavi RSA - passo per passo con p=11, q=17

PassoOperazioneCalcolo esempioNota
1Scelta primip = 11, q = 17In produzione centinaia di cifre, generati con Miller-Rabin
2Modulo nn = p x q = 11 x 17 = 187n e pubblico, parte di entrambe le chiavi
3Funzione di Eulero φ(n)φ(n) = (p-1)(q-1) = 10 x 16 = 160Conta numeri coprimi con n, rimane segreto
4Esponente pubblico ee = 7, MCD(7,160)=1 ok1 < e < φ(n) e coprimo con φ(n). Spesso si usa 65537
5Esponente privato dd = 23 perche 23x7=161 = 1x160+1 → (d x e) mod φ(n)=1d = e^-1 mod φ(n) inverso moltiplicativo, calcolato con Euclide esteso, segreto
🔓 CHIAVE PUBBLICA

(n, e) = (187, 7)

Distribuita liberamente

🔐 CHIAVE PRIVATA

(n, d) = (187, 23)

Mai rivelata - protetta con cura

PYTHON · RSA DIDATTICO p=11 q=17
p, q = 11, 17 n = p*q # 187 phi = (p-1)*(q-1) # 160 e = 7 # pubblico, coprimo con phi def egcd(a,b): if b==0: return (a,1,0) g,x1,y1 = egcd(b, a % b) return (g, y1, x1 - (a//b)*y1) _, d, _ = egcd(e, phi) d %= phi # 23 def encrypt(M): return pow(M, e, n) def decrypt(C): return pow(C, d, n) for ch in "ciao": M = ord(ch) C = encrypt(M) print(f"{ch} {M} -> C={C} -> M={decrypt(C)}") # 99->176->99, 105->96->105, 97->92->97, 111->155->111 # Verifica: 99^7 mod 187 = 176 | 176^23 mod 187 = 99

Esempio numerico completo - Bob cifra "ciao" per Alice

CarattereASCII (M)Cifrato C = M^7 mod 187Decifrato M = C^23 mod 187
c9917699 → c ✓
i10596105 → i ✓
a979297 → a ✓
o111155111 → o ✓
🎯 Esempio in classe - Calcolo verifica

Prendi la prima riga: 99^7 mod 187. In Python pow(99,7,187) = 176. Decifra pow(176,23,187) = 99. Le proprieta di Eulero garantiscono M^(e*d) ≡ M mod n quando e*d ≡ 1 mod φ(n). In produzione M < n, quindi si cifra a blocchi con padding OAEP (RFC 8017), non carattere per carattere — altrimenti attack con frequenza.

5. Sicurezza, limiti e minaccia quantistica

🔐 SICUREZZA

RSA 2048/4096

Per ricavare d serve fattorizzare n. Con chiavi 2048 o 4096 bit standard attuale, GNFS richiederebbe miliardi di anni. Sicuro con tecnologia classica.

⚠️ LIMITI

Lentezza e dimensione

RSA e ~1000x piu lento di AES. 1 MB con RSA-2048 = secondi, con AES-256 = microsecondi. Non si cifra direttamente file grandi, solo chiavi piccole.

⚠️ RSA e il calcolo quantistico - Algoritmo di Shor

L'algoritmo di Shor (1994) dimostra che un computer quantistico sufficientemente potente con qubit stabili puo fattorizzare in tempo polinomiale, rompendo RSA. Per questo NIST ha avviato standardizzazione post-quantistica: CRYSTALS-Kyber (KEM per scambio chiavi) e CRYSTALS-Dilithium (firme). RSA rimane sicuro oggi, ma la migrazione e gia iniziata in TLS 1.3 ibrido.

OPENSSL · LAB REALE
# Generazione coppia 2048 bit openssl genpkey -algorithm RSA -out private.pem -pkeyopt rsa_keygen_bits:2048 openssl pkey -in private.pem -pubout -out public.pem # Cifratura file con chiave pubblica (solo piccoli file / chiave AES) echo "chiave AES casuale 256bit" | openssl pkeyutl -encrypt -pubin -inkey public.pem -out aes_key.enc -pkeyopt rsa_padding_mode:oaep -pkeyopt rsa_oaep_md:sha256 # Decifratura openssl pkeyutl -decrypt -inkey private.pem -in aes_key.enc -out aes_key.dec -pkeyopt rsa_padding_mode:oaep -pkeyopt rsa_oaep_md:sha256 # NOTA: usa sempre OAEP con SHA-256, mai PKCS#1 v1.5 per nuovi progetti (Bleichenbacher)
💬 Tip del docente

All'esame ti chiedono "Perche RSA usa e=65537?" Risposta: e primo di Fermat (2^16+1), ha solo due bit a 1 → esponenziazione veloce in hardware, ed e abbastanza grande da evitare attacchi a basso esponente quando si usa padding corretto.

6. Crittosistemi ibridi - schema TLS reale

📌 Definizione da ricordare

Sistema ibrido: usa crittografia asimmetrica (RSA/ECDH) solo per scambiare in modo sicuro una chiave di sessione AES effimera, poi cifra tutto il traffico dati con AES simmetrico veloce. E il cuore di TLS, HTTPS, SSH, S/MIME.

SISTEMA IBRIDO - 5 PASSI INVIO + 3 RICEZIONE INVIO Brian -> Ada 1. Ottiene Kpub-Ada dal certificato 2. Genera K sessione AES-256 casuale (256 bit) 3. Cifra messaggio con K -> C1 = AES(K, M) 4. Cifra K con Kpub-Ada -> C2 = RSA(Kpub-Ada, K) 5. Invia C1 + C2 sul canale non sicuro C1 grande e veloce (AES)C2 piccolo e sicuro (RSA 256 byte) TLS fa esattamente questo in ClientHello/ServerHello RICEZIONE Ada 1. Riceve C1 (msg) e C2 (chiave) intercettabili 2. Decifra C2 con Kpriv-Ada -> ottiene K 3. Decifra C1 con K -> M = AES-1(K, C1) Criminal intercetta C1 e C2 masenza Kpriv-Ada non ottiene Ke quindi non legge M Vantaggio: velocita AES + distribuzione RSA K effimera = forward secrecy se usi ECDHE
CaratteristicaSolo AES (simmetrico)Solo RSA (asimmetrico)Sistema Ibrido
Distribuzione chiave❌ Problema irrisolto✅ Nessun problema✅ RSA/ECDH per la chiave di sessione
Velocità cifratura dati✅ Molto veloce❌ Molto lenta (~1000x)✅ AES per i dati
Dimensione gestibile✅ GB in ms❌ Max ~190 byte con RSA-2048 OAEP✅ File grandi via AES
Forward secrecy❌ No se chiave statica❌ No se RSA statico✅ Si con ECDHE + chiave effimera
Usato inDisco, archivi cifratiFirma digitale, KEM piccoloTLS 1.2/1.3, HTTPS, SSH, S/MIME, PGP
🎯 Esempio in classe - Navigazione HTTPS

Apri DevTools → Security: quando visiti il sito, il browser fa handshake TLS ibrido: (1) scambia Kpub del server via certificato X.509, (2) negozia K di sessione AES-GCM 256 con ECDHE, (3) tutto il traffico HTTP e cifrato con AES-GCM veloce. RSA/ECDH dura pochi ms all'inizio, AES cifra MB di pagina/doc in microsecondi.

7. Verifica / Esercizio

🔬 Attività pratica + domande

Apri il lab OpenSSL collegato e completa.

  1. Genera coppia RSA con p=13, q=19. Calcola n, φ(n), scegli e=5 (verifica MCD), trova d con Euclide esteso.
  2. Con n=187,e=7,d=23 cifra M=52. Quanto vale C = M^e mod n? Poi decifra per verifica.
  3. Spiega perche in TLS si usa ECDHE per generare K e non RSA statico: cosa succede se rubano la privata del server dopo 6 mesi?
  4. Scenario combinato: Ada vuole mandare contratto segreto e firmato a Brian. Descrivi ordine esatto di chiavi (chi firma con cosa, chi cifra con cosa).
✅ Soluzione ragionata

1. n=13*19=247, φ=12*18=216, e=5 MCD(5,216)=1 ok. d = 5^-1 mod 216 = 173 perche 5*173=865=4*216+1. Chiavi (247,5) pub, (247,173) priv.
2. pow(52,7,187)=? Calcolato con pow = 79. Verifica pow(79,23,187)=52. Round-trip ok.
3. Con RSA statico, se rubano Kpriv server decifrano tutto il traffico passato registrato. Con ECDHE effimero ogni sessione ha K unica scartata → forward secrecy, passato rimane sicuro.
4. Firma: X=C(Kpriv-Ada, Contratto). Poi confidenzialita: Y=C(Kpub-Brian, X). Brian fa D(Kpriv-Brian,Y)=X poi D(Kpub-Ada,X)=Contratto verificato e segreto.

✓La crittografia asimmetrica risolve il key distribution problem usando coppia pubblica/privata matematicamente collegata ma non derivabile
✓Kpub destinatario = confidenzialita, Kpriv mittente = autenticita/firma, combinate = entrambe le garanzie
✓RSA: sicurezza = fattorizzazione difficile, generazione = p,q primi → n=pq, φ=(p-1)(q-1), e coprimo, d=e^-1 mod φ
✓Formule: C=M^e mod n (cifratura), M=C^d mod n (decifratura), con esempio 99^7 mod187=176 e 176^23 mod187=99
✓RSA lento → sistemi ibridi: RSA/ECDH solo per scambiare chiave di sessione AES casuale ed effimera, AES per i dati (modello TLS/HTTPS/SSH)
✓Shor quantistico minaccia RSA → transizione NIST post-quantistica: Kyber per KEM, Dilithium per firme, chiavi RSA 2048/4096 ancora standard classico

📚 Prossimo passo - Autenticazione, hash, firma digitale, certificati

Ora che sai scambiare chiavi in modo ibrido, vedremo come garantire integrita con hash SHA, firma digitale, certificati X.509, PKI e protocolli SAML/OAuth/SPID/FIDO2 per l'autenticazione reale.