Crittografia asimmetrica, RSA e TLS
In questa pagina 8
La crittografia asimmetrica
Definizione (crittografia asimmetrica). Detta anche a chiave pubblica. Usa chiavi diverse per cifrare e decifrare. La chiave di cifratura è pubblica e può essere visibile a tutti; la chiave di decifratura è privata, tenuta segreta da ogni nodo e conservata in registri protetti dall'hardware. Le due chiavi sono generate da un metodo che calcola una coppia corrispondente: sono legate matematicamente.
Se il mittente A vuole scrivere a B, indicando con la chiave pubblica di B e con la sua chiave privata:
Proprietà richieste:
- gli algoritmi di cifratura e decifratura sono facili da calcolare;
- è computazionalmente facile generare una coppia di chiavi;
- è computazionalmente impraticabile ricavare la chiave privata dalla corrispondente chiave pubblica;
- dati il testo cifrato e la chiave pubblica, è impraticabile ricostruire il testo in chiaro.
Per cifrare si usa la chiave pubblica (che chiunque può avere): dopo la cifratura il messaggio è rimescolato e nessuno lo capisce senza la chiave privata corrispondente. La riservatezza è garantita perché solo il destinatario B conosce la propria chiave privata. Chi intercetta ottiene il testo cifrato e accede alla chiave pubblica, ma non riesce a ricostruire il messaggio.
Esempio. In una rete di persone servono coppie di chiavi, una per persona (e non chiavi segrete come nella crittografia simmetrica, Funzioni hash e crittografia simmetricaLa crittografia trasforma un messaggio in chiaro (plaintext) in un testo cifrato (ciphertext) con una chiave: C = E_ke(P), P = D_kd(C); può dare riservatezza, integrità e autenticazione. Attacchi: solo testo cifrato, testo in chiaro noto, testo in chiaro scelto, forza bruta. Funzione hash: mappa dati di qualsiasi lunghezza in un digest di lunghezza fissa; one-way (dato h è difficile trovare m con hash(m) = h) e resistente alle collisioni; famiglie MD (MD5 rotto per le collisioni nel 2004) e SHA (SHA-0 e SHA-1 rotti, SHA-2 il più usato, SHA-3); costruzione di Merkle-Damgård; usi: integrità e password. Crittografia simmetrica: stessa chiave segreta per cifrare e decifrare; Cesare (E_n(x) = x + n mod 26), Vigenère, Enigma; DES (blocchi da 64 bit, chiave da 56) e AES (blocchi da 128 bit, chiavi da 128, 192, 256); modi ECB (insicuro), CBC, CFB, OFB, CTR. Scambio della chiave con Diffie-Hellman: K = g^(xy) mod p. MAC e HMAC: autenticazione con chiave condivisa.Funzioni hash e crittografia simmetrica →: lì ogni coppia di persone ha una chiave segreta propria, e le coppie non ordinate di persone si contano con il coefficiente binomialeil numero di modi di scegliere 2 elementi da n senza badare all'ordine è n(n-1)/2Fattoriale e coefficienti binomiali →), e ciascuno può pubblicare la sua chiave pubblica su un sito. Ma una chiave pubblica va distribuita e il suo legame con il proprietario va certificato: lo fanno i certificati.
Certificati digitali
Se un messaggio è cifrato con la chiave pubblica di qualcuno, solo la sua chiave privata lo decifra. Le chiavi pubbliche però devono essere distribuite in qualche modo, e il collegamento tra proprietario e chiave deve essere certificato: ci deve essere un rapporto di fiducia tra chiave pubblica e privata. I certificati digitali servono a questo.
Definizione (certificato digitale). Un certificato è gestito da una terza parte, la Certificate Authority (CA). Per ottenerlo, un'entità fornisce alla CA la propria identità e la propria chiave pubblica; la CA convalida l'identità ed emette il certificato. Il certificato contiene: il nome dell'entità proprietaria e la sua chiave pubblica; la validità o scadenza; la CA che l'ha emesso (e molti altri dati). È firmato con la chiave privata della CA: chiunque abbia la sua chiave pubblica può verificare il certificato.
Esempio (come nelle slide). Visitando https://www.google.com, il browser controlla automaticamente il certificato digitale inviato da Google. Un certificato reale contiene: nome del sito www.google.com; chiave pubblica (una lunga stringa casuale); emittente (Google Trust Services LLC, la CA); periodo di validità (per esempio da marzo 2025 a marzo 2026); firma della CA, che prova che è legittimo. Il browser lo controlla: se è valido pensa "questa chiave pubblica appartiene davvero a Google", e può cifrare i dati verso Google in sicurezza.
Il browser verifica la firma con la chiave pubblica della CA, che a sua volta ha un certificato firmato da una CA di livello superiore, fino a una CA radice il cui certificato è già nell'elenco del sistema operativo o del browser (catena di fiducia); controlla anche le date di validità e che il nome del sito corrisponda a quello del certificato.
Firma digitale
Se un messaggio è cifrato con la propria chiave privata, chiunque abbia la chiave pubblica può verificare che sia stato proprio il proprietario a mandarlo. La firma digitale serve a questo e garantisce:
- autenticità (il messaggio viene davvero dal mittente);
- integrità (il messaggio non è stato alterato);
- non ripudio (il mittente non può negare in seguito di averlo mandato).
Definizione (firma digitale). Fase 1, firma: si calcola l'hash del messaggio (con una funzione hash crittografica come SHA-256, Funzioni hash e crittografia simmetricaLa crittografia trasforma un messaggio in chiaro (plaintext) in un testo cifrato (ciphertext) con una chiave: C = E_ke(P), P = D_kd(C); può dare riservatezza, integrità e autenticazione. Attacchi: solo testo cifrato, testo in chiaro noto, testo in chiaro scelto, forza bruta. Funzione hash: mappa dati di qualsiasi lunghezza in un digest di lunghezza fissa; one-way (dato h è difficile trovare m con hash(m) = h) e resistente alle collisioni; famiglie MD (MD5 rotto per le collisioni nel 2004) e SHA (SHA-0 e SHA-1 rotti, SHA-2 il più usato, SHA-3); costruzione di Merkle-Damgård; usi: integrità e password. Crittografia simmetrica: stessa chiave segreta per cifrare e decifrare; Cesare (E_n(x) = x + n mod 26), Vigenère, Enigma; DES (blocchi da 64 bit, chiave da 56) e AES (blocchi da 128 bit, chiavi da 128, 192, 256); modi ECB (insicuro), CBC, CFB, OFB, CTR. Scambio della chiave con Diffie-Hellman: K = g^(xy) mod p. MAC e HMAC: autenticazione con chiave condivisa.Funzioni hash e crittografia simmetrica →); si cifra l'hash con la chiave privata: questa è la firma; si manda il messaggio insieme alla firma. Fase 2, verifica: il ricevente calcola da sé l'hash del messaggio; decifra la firma ricevuta con la chiave pubblica del mittente; se
hash decifrato == hash calcolato, il messaggio è autentico.
La firma cifra con la chiave privata (e può verificare chiunque); la cifratura riservata usa la chiave pubblica del destinatario (e solo lui legge): i ruoli sono opposti. Si firma l'hash e non l'intero messaggio perché è corto e il calcolo è veloce. Il confronto con il MAC è nella tabella di Funzioni hash e crittografia simmetricaLa crittografia trasforma un messaggio in chiaro (plaintext) in un testo cifrato (ciphertext) con una chiave: C = E_ke(P), P = D_kd(C); può dare riservatezza, integrità e autenticazione. Attacchi: solo testo cifrato, testo in chiaro noto, testo in chiaro scelto, forza bruta. Funzione hash: mappa dati di qualsiasi lunghezza in un digest di lunghezza fissa; one-way (dato h è difficile trovare m con hash(m) = h) e resistente alle collisioni; famiglie MD (MD5 rotto per le collisioni nel 2004) e SHA (SHA-0 e SHA-1 rotti, SHA-2 il più usato, SHA-3); costruzione di Merkle-Damgård; usi: integrità e password. Crittografia simmetrica: stessa chiave segreta per cifrare e decifrare; Cesare (E_n(x) = x + n mod 26), Vigenère, Enigma; DES (blocchi da 64 bit, chiave da 56) e AES (blocchi da 128 bit, chiavi da 128, 192, 256); modi ECB (insicuro), CBC, CFB, OFB, CTR. Scambio della chiave con Diffie-Hellman: K = g^(xy) mod p. MAC e HMAC: autenticazione con chiave condivisa.Funzioni hash e crittografia simmetrica →. Un esempio numerico con RSA è più sotto.
Richiami di aritmetica modulare
Un intero si scrive come , con quoziente, modulo (divisore), resto: .
Esempi (come nelle slide). Addizione: . Sottrazione: . Moltiplicazione: . Esponenziazione: .
Addizione, sottrazione, moltiplicazione ed esponenziazione si comportano come ci si aspetta (modulo ).
Perché si può ridurre prima di operare. Se e (con , ), allora cioè e hanno lo stesso resto modulo : . Lo stesso vale per la somma. È la regola che permette di non far mai crescere i numeri: dopo ogni prodotto si riduce modulo e si resta sotto . Esempio con : , quindi ; per non si calcola ma , quindi . Calcolare vuol dire moltiplicare per se stesso volte (non è efficiente in questo modo, ma esistono algoritmi efficienti, come le potenze ripetute).
Potenze ripetute (square-and-multiply). Si scrive l'esponente in binario (Sistemi di numerazione posizionaliNotazione posizionale in base b; conversioni tra base 10, 2, 8 e 16 per interi (divisioni successive) e per parti frazionarie (moltiplicazioni successive); numeri periodici in binario.Sistemi di numerazione posizionali →) e si calcolano i quadrati successivi (ciascuno è il quadrato del precedente, ridotto modulo ); poi si moltiplicano, sempre riducendo, solo i quadrati che corrispondono alle cifre . Esempio: , quindi , e richiede quadrati: in tutto moltiplicazioni al posto di . In generale un esponente di bit richiede al massimo moltiplicazioni modulari: per ( bit, cinque cifre ) sono quadrati e prodotti, moltiplicazioni invece di ; con un esponente di bit sono al massimo circa moltiplicazioni invece di un numero di operazioni con più di cifre decimali. La divisione funziona diversamente: si usa l'inverso modulare.
Definizione (inverso modulare). è l'inverso modulare di modulo se . Esiste se (cioè se e sono coprimi); quindi, se è primo, ogni intero tra 1 e ha un inverso modulo . La divisione modulare è .
Come si trova l'inverso: algoritmo di Euclide esteso. L'algoritmo di Euclidesi calcola il MCD dividendo ripetutamente: la coppia (a, b) diventa (b, a mod b) finché il resto è 0 e l'ultimo resto non nullo è il MCDCiclo while → dà il con una sequenza di divisioni con resto; risalendo le divisioni all'indietro si scrive il come combinazione . Riducendo modulo resta , cioè è l'inverso. Se il è diverso da questa combinazione non esiste e l'inverso non c'è.
Esempio: inverso di modulo (serve in RSA, sotto).
- Divisioni (ciascuna usa come divisore il resto della precedente): ; ; . L'ultimo resto non nullo è : , l'inverso esiste.
- Si risale: ; poiché , ; poiché , .
- Modulo il termine vale , quindi e .
Esempio. , : deve valere , quindi , infatti . , : , infatti . Divisione: ; poiché (), . Altri: , (verificati con Python). La divisione per 0 non è ammessa.
Definizione (logaritmo discreto). Se , allora è il logaritmo discreto. Non si conosce alcun algoritmo in tempo polinomiale per calcolarlo.
Esempio. , , : . Le potenze di 5 modulo 7 sono per : , quindi . Con di 2048 bit non si può più provare.
RSA
Il Diffie-Hellman (Funzioni hash e crittografia simmetricaLa crittografia trasforma un messaggio in chiaro (plaintext) in un testo cifrato (ciphertext) con una chiave: C = E_ke(P), P = D_kd(C); può dare riservatezza, integrità e autenticazione. Attacchi: solo testo cifrato, testo in chiaro noto, testo in chiaro scelto, forza bruta. Funzione hash: mappa dati di qualsiasi lunghezza in un digest di lunghezza fissa; one-way (dato h è difficile trovare m con hash(m) = h) e resistente alle collisioni; famiglie MD (MD5 rotto per le collisioni nel 2004) e SHA (SHA-0 e SHA-1 rotti, SHA-2 il più usato, SHA-3); costruzione di Merkle-Damgård; usi: integrità e password. Crittografia simmetrica: stessa chiave segreta per cifrare e decifrare; Cesare (E_n(x) = x + n mod 26), Vigenère, Enigma; DES (blocchi da 64 bit, chiave da 56) e AES (blocchi da 128 bit, chiavi da 128, 192, 256); modi ECB (insicuro), CBC, CFB, OFB, CTR. Scambio della chiave con Diffie-Hellman: K = g^(xy) mod p. MAC e HMAC: autenticazione con chiave condivisa.Funzioni hash e crittografia simmetrica →) serve a far concordare due parti sulla stessa chiave condivisa, e poi si cifra con un cifrario simmetrico. Nella crittografia a chiave pubblica c'è una seconda idea, la cifratura a chiave pubblica (Public Key Encryption, PKE). L'algoritmo RSA prende il nome dagli inventori Rivest, Shamir e Adleman (1978). Come Diffie-Hellman si appoggia sulla difficoltà del logaritmo discreto, RSA si appoggia sulla difficoltà della fattorizzazione di numeri grandi.
Situazione: il mittente Alice, il ricevente Bob. Obiettivo: generare una chiave pubblica con cui Alice cifra i messaggi per Bob e una chiave privata che aiuta Bob a decifrarli.
Formula (generazione delle chiavi RSA).
- Si scelgono due numeri primi grandi e .
- Si calcola .
- Si calcola il totiente , cioè quanti interi tra e sono coprimi con (motivazione sotto).
- Si trova un intero positivo coprimo con , cioè .
- Si calcola .
esiste, perché e sono coprimi; e sono uno l'inverso modulare dell'altro: (per costruzione: proprietà P1).
Chiave pubblica di Bob: , comunicata a chiunque voglia scrivergli. Chiave segreta: ; le informazioni segrete sono la quaterna , che non va condivisa con nessuno.
Formula (cifratura e decifratura RSA). Bob manda a Alice . Alice cifra il messaggio (con ): . Bob decifra con la chiave segreta: . Il blocco di messaggio può essere al massimo lungo quanto .
Perché . Gli interi da a non coprimi con sono quelli divisibili per o per (gli unici divisori primi di ). I multipli di sono : sono ; i multipli di sono ; nessun numero è multiplo di entrambi (sarebbe multiplo di ). Quindi i coprimi sono . Con , : .
Perché funziona (teorema di Eulero). Per ogni intero (messaggio) coprimo con vale . Idea della dimostrazione: siano gli interi coprimi con (modulo ). Moltiplicarli per (coprimo) li rimescola senza ripetizioni né uscite dall'insieme: sono ancora gli stessi numeri, in un altro ordine. Il prodotto di tutti è quindi lo stesso, con , e siccome è coprimo con si può dividere per (inverso modulare), ottenendo . Esempio con (, coprimi ): moltiplicando per si ottiene , gli stessi numeri; e infatti . Per primo è il piccolo teorema di Fermat, . Poiché per P1, si ha per un certo , e quindi
Passaggi: la prima uguaglianza sostituisce ; per le regole delle potenze (Esponenziale e logaritmoLa funzione esponenziale a^x (base positiva diversa da 1) e la sua inversa, il logaritmo in base a, con grafici e proprietà.Esponenziale e logaritmo →); viene da ; ; e per Eulero.
Il caso di non coprimo con è rarissimo con grande (vuol dire che è un multiplo di o di ), ma il risultato vale lo stesso. Se divide : modulo si ha e quindi ; modulo , è coprimo con e per Fermat , perciò . Poiché è divisibile sia per sia per , lo è per .
Esempio completo (numeri piccoli). , : , . Si prende (coprimo con , perché è primo e non compare tra i fattori) e (calcolato con Euclide esteso nella sezione sopra), perché . Messaggio : . Con le potenze ripetute (, ogni valore è il quadrato del precedente ridotto modulo ): , , , , quindi (per esempio l'ultimo quadrato è ). Decifratura: (verificato con Python; verificato anche ). Chiave pubblica , segreta ; il messaggio deve essere minore di 3233.
Sicurezza.
- Se un attaccante riuscisse a fattorizzare in e , potrebbe calcolare la chiave segreta. RSA è sicuro se e solo se la fattorizzazione degli interi è difficile per quelle scelte di interi.
- e si scelgono a caso, devono essere primi e grandi, e deve superare i 2048 bit (circa 617 cifre decimali: , Esponenziale e logaritmoLa funzione esponenziale a^x (base positiva diversa da 1) e la sua inversa, il logaritmo in base a, con grafici e proprietà.Esponenziale e logaritmo →) per evitare gli algoritmi di fattorizzazione oggi noti.
- La struttura del modulo è scelta per evitare attacchi ovvi e non ovvi: per esempio, fare di il prodotto di due primi della stessa dimensione evita alcuni attacchi noti (primi da 1500 a 3000 bit).
- Come per Diffie-Hellman, ci sono molte altre proprietà sottili della generazione delle chiavi e della decifratura che, se implementate male, creano vulnerabilità anche se l'algoritmo sembra semplice.
Padding casuale. Una caratteristica da implementare obbligatoriamente è un riempimento casuale (random padding). Per esempio con RSA PKCS #1 v1.5 il messaggio completato è . La dimensione utile del messaggio diminuisce, per lasciare posto alla stringa di riempimento (il blocco massimo resta ). Il padding risolve l'attacco a testo cifrato scelto adattivo e dà sicurezza semantica; PKCS #1 v1.5 è molto usato oggi.
Autenticazione con RSA
Si vuole una prova certificata dell'identità di un server o, più formalmente, che (i) un certo documento digitale sia stato generato da un'entità legittima e (ii) non sia stato modificato strada facendo. Il server manda un pacchetto con un messaggio in chiaro (per esempio un certificato di identità) con in coda una firma digitale .
- il server ottiene la firma del messaggio usando la chiave segreta : ;
- il client verifica che la firma sia corretta con la chiave pubblica : calcola .
Se il risultato è uguale a , è una prova certificata (per la struttura algebrica) che il messaggio è stato firmato dall'entità legittima, l'unica che conosce la chiave segreta.
Esempio (chiavi sopra). Il server firma : . Il client calcola : firma valida. Se il messaggio arrivasse cambiato in , il client calcolerebbe e scarterebbe il pacchetto. Con la firma sull'hash (come nella sezione "Firma digitale") si firma al posto di : con un hash di valore si ha e .
Attacchi a RSA semplice (appendice)
Malleabilità (attacco a testo cifrato scelto adattivo). Con l'RSA "nudo", Mallory può farsi decifrare il messaggio di Alice.
- Mallory intercetta il messaggio cifrato .
- Sceglie un numero casuale .
- Calcola un nuovo testo cifrato (con la chiave pubblica) .
- Manda a Bob, che lo decifra e ritorna a Mallory.
- Mallory calcola : ha ottenuto il messaggio.
Il passo 4 dipende dal contesto e dall'applicazione (il server può restituire o no il testo in chiaro), ma ci sono casi pratici in cui succede; la robustezza a questo attacco è oggi un requisito standard per un algoritmo di sicurezza.
Esempio (, , , ). Con : . Bob decifra . Mallory ottiene .
Determinismo. L'RSA nudo non è semanticamente sicuro: con la stessa chiave pubblica e lo stesso messaggio il testo cifrato è sempre lo stesso, a ogni cifratura successiva.
Contromisura. Alice costruisce con un riempimento casuale . Mallory intercetta , sceglie e produce ; Bob lo decifra, elimina il riempimento dal risultato e restituisce un ; quindi : il riempimento ha distrutto la struttura algebrica.
Attacco alle firme RSA semplici. Un attaccante vuole ottenere da un server la firma di un messaggio (conosce ).
- Calcola un messaggio apparentemente innocuo per qualche .
- Chiede al server di firmare , ottenendo .
- Calcola , perché (stessa dimostrazione della decifratura; esiste perché è coprimo con ).
Esempio (, ). ; il server firma: ; l'attaccante ottiene , che è proprio : ha una firma su senza averla mai chiesta. Per questo si firma l'hash con padding (PSS) e non il messaggio nudo.
Dove si mette la sicurezza: applicazione o trasporto
Alcuni protocolli ISO/OSI non offrono funzioni di sicurezza: queste sono realizzate dall'applicazione o da uno dei livelli sotto.
- Sicurezza a livello applicazione: si può garantire una protezione end-to-end; semplifica i requisiti dei livelli sotto e riduce il costo in dimensione dei pacchetti ed elaborazione, perché l'overhead è introdotto per dato e non per pacchetto.
- Sicurezza a livello trasporto o rete: lo stesso meccanismo di sicurezza può essere condiviso da più applicazioni.
TLS e SSL
Definizione (SSL/TLS). SSL e TLS (Secure Socket Layer, Transport Layer Security) sono protocolli crittografici che garantiscono una comunicazione affidabile in rete. SSL (3.0) è ancora usato ma ha vulnerabilità note (POODLE) e se ne sconsiglia l'uso; TLS è la versione più recente e più sicura, ed è quella raccomandata. Sono progettati per funzionare con TCP (TCP - connessione, affidabilità e controllo di flussoTCP (Transmission Control Protocol) è il protocollo di trasporto con connessione e affidabile: trasforma il servizio senza connessione e inaffidabile di IP in un flusso di byte ordinato, senza errori né duplicati. La connessione si apre con l'handshake a tre vie (SYN, SYN+ACK, ACK) e si chiude con tre o quattro segmenti (FIN). I byte sono numerati: il numero di sequenza è quello del primo byte del segmento, il numero di ACK (cumulativo) è il prossimo byte atteso. Il mittente può inviare $\min(\text{rwnd},\text{cwnd})$ byte non ancora confermati; rwnd (finestra del ricevitore, in un campo di 16 bit) è il controllo di flusso. L'errore si gestisce con checksum, ACK, timeout di ritrasmissione (RTO) e ritrasmissione rapida dopo tre ACK duplicati. Per usare tutto il canale la finestra deve valere almeno il prodotto banda-ritardo (BDP); il throughput massimo è $\text{MSS}\cdot W_{\max}/\text{RTT}$.TCP - connessione, affidabilità e controllo di flusso →) e usano i certificati per stabilire un collegamento cifrato tra client e server.
Le funzioni principali:
- autenticare gli estremi e definire l'insieme delle chiavi crittografiche;
- scambiare dati riservati con la cifratura simmetrica;
- autenticare i messaggi con un hash sicuro.
Il certificato contiene una chiave pubblica che autentica l'identità del sito o server e permette il trasferimento cifrato dei dati con la crittografia asimmetrica.
Come funziona.
- Il client chiede l'accesso a una risorsa protetta su un server.
- Il server risponde con il proprio certificato, che include la chiave pubblica e la sua firma.
- Il client verifica che il certificato sia valido e fidato (emesso da una CA, non scaduto, firma del server valida): così il server è autentico.
- Il client genera una chiave di sessione simmetrica e la cifra con la chiave pubblica del server: la chiave di sessione arriva al server in modo sicuro.
- Il server decifra la chiave di sessione con la propria chiave privata.
- Le due parti usano la chiave di sessione simmetrica per trasmettere e ricevere i dati su un canale cifrato.
I messaggi (TLS 1.0): (1) ClientHello (cifrari supportati); (2) ServerHello (cifrario scelto); (3) certificato del server + firma; (4) il client verifica il certificato; (5) client key exchange, cifrato con la chiave pubblica del server; (6) il server ottiene la chiave di sessione con la sua chiave privata; (7) Client finished; (8) Server finished; poi i messaggi scambiati sono cifrati con la chiave di sessione condivisa.
Client Server
|--(1) ClientHello: cifrari supportati --------------------------->|
|<-(2) ServerHello: cifrario scelto ------------------------------|
|<-(3) certificato del server + firma ----------------------------|
| (4) verifica il certificato |
|--(5) client key exchange (cifrato con la chiave pubblica) ------>|
| (6) ricava la chiave di sessione con la chiave privata
|--(7) Client finished ------------------------------------------>|
|<-(8) Server finished -------------------------------------------|
|<=============== dati cifrati con la chiave di sessione ==========>|Chiavi usate.
- Chiave asimmetrica: la coppia pubblica/privata identifica il server e avvia la sessione cifrata. La chiave privata è nota solo al server; la pubblica è condivisa con il certificato.
- Chiave di sessione simmetrica: chiavi usa e getta generate per ogni connessione, usate per cifrare e decifrare i dati trasmessi. Sono scambiate in modo sicuro con la cifratura asimmetrica.
Servizi offerti.
- Autenticazione: i certificati sono emessi da una CA fidata, firmati e verificati dal client: prova dell'identità.
- Cifratura: asimmetrica per stabilire la connessione sicura, simmetrica per trasmettere i dati: riservatezza.
- Integrità dei dati: a tutti i messaggi sono aggiunti codici di autenticazione (MAC, Funzioni hash e crittografia simmetricaLa crittografia trasforma un messaggio in chiaro (plaintext) in un testo cifrato (ciphertext) con una chiave: C = E_ke(P), P = D_kd(C); può dare riservatezza, integrità e autenticazione. Attacchi: solo testo cifrato, testo in chiaro noto, testo in chiaro scelto, forza bruta. Funzione hash: mappa dati di qualsiasi lunghezza in un digest di lunghezza fissa; one-way (dato h è difficile trovare m con hash(m) = h) e resistente alle collisioni; famiglie MD (MD5 rotto per le collisioni nel 2004) e SHA (SHA-0 e SHA-1 rotti, SHA-2 il più usato, SHA-3); costruzione di Merkle-Damgård; usi: integrità e password. Crittografia simmetrica: stessa chiave segreta per cifrare e decifrare; Cesare (E_n(x) = x + n mod 26), Vigenère, Enigma; DES (blocchi da 64 bit, chiave da 56) e AES (blocchi da 128 bit, chiavi da 128, 192, 256); modi ECB (insicuro), CBC, CFB, OFB, CTR. Scambio della chiave con Diffie-Hellman: K = g^(xy) mod p. MAC e HMAC: autenticazione con chiave condivisa.Funzioni hash e crittografia simmetrica →) per assicurare che i dati non siano alterati in transito.
Da TLS 1.0 a TLS 1.3
Usare la stessa coppia di chiavi (pubblica, privata) sia per l'autenticazione sia per generare poi la chiave condivisa non si fa più. Motivo: se un attaccante registra tutta la transazione (leggendo i pacchetti che viaggiano in rete), con calma riesce a rompere la chiave (cioè a recuperare la chiave privata del server) e ottiene l'accesso a tutte le transazioni cifrate successive, e anche a quelle già registrate. L'approccio attuale:
- si usa Diffie-Hellman per generare la chiave condivisa (così la chiave privata del server serve solo a firmare);
- si riduce la latenza: l'accordo sulle suite crittografiche non è più fatto in un passo a parte.
TLS 1.3
Client Server
|--(1) ClientHello [Random, g^c mod p] ------------------------->|
| (2) K = (g^s mod p)^c |<-(3) ServerHello [Random, g^s mod p]
| (4) K = (g^c mod p)^s
|<-(5) Certificate + Sign(Ks, handshake (1)+(3)), Finished, dati applicativi
|--(6) Finished ---------------------------------------------------->|
|--(7) dati applicativi ============================================>|La chiave Diffie-Hellman è generata dopo i primi due messaggi; il certificato (5) è cifrato con e la firma contiene i messaggi (1)+(3); i numeri casuali (nonce) nei messaggi Hello garantiscono l'unicità; è la chiave privata del server (la pubblica è nel certificato). Con autenticazione del client, il server aggiunge una richiesta di certificato in (5) e il client risponde in (6) con il proprio certificato e una firma , dove è la chiave privata del client.
Esempio numerico (DH nell'handshake, , ). Il client sceglie e manda ; il server sceglie e manda . Il client calcola ; il server . Passaggi con le potenze ripetute: , , ; e , quindi ; infine , (e i due calcoli concordano perché ). Da si ricavano le chiavi simmetriche dei record. In TLS reale è di almeno 2048 bit (oppure si usa Diffie-Hellman su curve ellittiche). Poiché è effimero (diverso a ogni connessione e buttato via), la compromissione futura della chiave privata del server non permette di decifrare il traffico registrato (forward secrecy).
Esempio (numero di RTT). Nell'handshake TLS 1.0 ci sono due scambi (messaggi 1-3 e 5-8) prima che i dati siano protetti: 2 RTT; in TLS 1.3 il client manda già la propria parte Diffie-Hellman nel primo messaggio: 1 RTT. Una prima richiesta HTTPS (Livello applicazione - HTTPIl livello applicazione è il più alto della pila: offre servizi all'utente con una connessione logica tra le due applicazioni e riceve servizi solo dal trasporto (DNS, HTTP, e-mail, FTP). Il Web (WWW, nato al CERN nel 1989) è un servizio client-server distribuito di pagine collegate da ipertesti; ogni pagina ha un URL protocollo://host:porta/percorso. HTTP: il client manda una richiesta, il server una risposta, su TCP (server sulla porta 80, client su una porta temporanea); senza stato. Messaggi di testo (riga di richiesta o di stato, intestazioni, riga vuota, corpo), metodi GET, POST, HEAD, PUT, DELETE, codici di stato 2xx-5xx. Una pagina con N oggetti incorporati richiede 2(N+1) RTT con connessioni non persistenti e (N+2) RTT con connessione persistente (trascurando la trasmissione). I cookie danno memoria al protocollo: Set-Cookie nella risposta, Cookie nelle richieste, file nel browser e base di dati nel sito. Un proxy (web cache) tiene le copie delle risposte recenti: meno carico sul server, meno traffico, meno ritardo.Livello applicazione - HTTP →) con ms costa quindi: TCP 1 RTT + TLS 1.3 1 RTT + richiesta 1 RTT RTT s; con TLS 1.0, RTT s.
Le due parti del protocollo.
- Protocollo di handshake: negozia modi e parametri crittografici, autentica le parti, stabilisce il materiale della chiave condivisa. Il Server Hello include il livello di protocollo di sicurezza, i parametri crittografici scelti dall'elenco del client, un numero casuale combinato con data e ora, l'identificatore di sessione, i metodi di compressione, il certificato digitale (con identità e chiave pubblica di cifratura).
- Protocollo di record: usa i parametri stabiliti dall'handshake per proteggere il traffico tra gli estremi, dividendolo in una serie di record, ognuno protetto in modo indipendente con le chiavi di traffico.
DTLS (Datagram TLS) è il progetto per funzionare con UDP (Protocollo UDPUDP (User Datagram Protocol) è il protocollo di trasporto senza connessione e inaffidabile: rispetto a IP aggiunge soltanto la comunicazione processo-processo (numeri di porta) e un controllo d'errore facoltativo. L'intestazione è di soli 8 byte (porta sorgente, porta destinazione, lunghezza, checksum). Il checksum copre pseudo-intestazione (indirizzi IP, protocollo 17, lunghezza), intestazione e dati, ed è il complemento a uno della somma a 16 bit; se vale 0 significa "non calcolato", e un risultato 0 si trasmette come 0xFFFF. UDP non ha connessione, numeri di sequenza, controllo di flusso, di errore né di congestione: si sceglie per i messaggi brevi (DNS, DHCP, RIP, SNMP) e per le applicazioni in tempo reale, dove conta non aggiungere ritardo.Protocollo UDP →). Problema: l'overhead di DTLS, perché i protocolli sotto hanno dimensione di pacchetto limitata, e si usano ottimizzazioni dei pacchetti e compressione. DTLS crea un'associazione sicura punto-punto (con un handshake simile a quello di TLS): non è compatibile con le comunicazioni IP multicast. Tre modi di sicurezza: PreSharedKey (i dispositivi conservano chiavi simmetriche pre-condivise), RawPublicKey (i dispositivi hanno una coppia di chiavi pubblica-privata senza certificato), Certificate (i dispositivi conservano un certificato X.509).
Errori comuni
- Cifrare con la chiave sbagliata: riservatezza = chiave pubblica del destinatario; firma = chiave privata del mittente.
- Usare RSA senza padding (deterministico, malleabile), o credere che RSA cifri un file intero: si cifra una chiave di sessione e i dati vanno in simmetrica.
- Scegliere non coprimo con (non esiste ), o dimenticare .
- Dimenticare che i certificati servono a legare l'identità alla chiave pubblica: senza, un uomo in mezzo può dare la propria chiave.
- Pensare che in TLS la chiave di sessione sia sempre cifrata con la chiave pubblica del server: da TLS 1.3 si ricava con Diffie-Hellman.
- Confondere TLS (su TCP) con DTLS (su UDP).
Versione ripasso
- Asimmetrica (a chiave pubblica). Chiavi diverse per cifrare e decifrare, legate matematicamente: pubblica (cifra), privata (decifra). Formule: , . Riservatezza: solo B conosce ; dalla chiave pubblica non si ricava la privata. Esempio: persone servono coppie, contro chiavi segrete della simmetrica (Funzioni hash e crittografia simmetricaLa crittografia trasforma un messaggio in chiaro (plaintext) in un testo cifrato (ciphertext) con una chiave: C = E_ke(P), P = D_kd(C); può dare riservatezza, integrità e autenticazione. Attacchi: solo testo cifrato, testo in chiaro noto, testo in chiaro scelto, forza bruta. Funzione hash: mappa dati di qualsiasi lunghezza in un digest di lunghezza fissa; one-way (dato h è difficile trovare m con hash(m) = h) e resistente alle collisioni; famiglie MD (MD5 rotto per le collisioni nel 2004) e SHA (SHA-0 e SHA-1 rotti, SHA-2 il più usato, SHA-3); costruzione di Merkle-Damgård; usi: integrità e password. Crittografia simmetrica: stessa chiave segreta per cifrare e decifrare; Cesare (E_n(x) = x + n mod 26), Vigenère, Enigma; DES (blocchi da 64 bit, chiave da 56) e AES (blocchi da 128 bit, chiavi da 128, 192, 256); modi ECB (insicuro), CBC, CFB, OFB, CTR. Scambio della chiave con Diffie-Hellman: K = g^(xy) mod p. MAC e HMAC: autenticazione con chiave condivisa.Funzioni hash e crittografia simmetrica →).
- Certificato digitale. Emesso da una Certificate Authority (CA) dopo aver verificato l'identità del richiedente. Contiene nome del titolare, chiave pubblica, validità, emittente, ed è firmato con la chiave privata della CA. Il browser verifica la firma, le date, il nome del sito, e risale la catena di fiducia fino a una CA radice presente nel sistema operativo o nel browser.
- Firma digitale. Firma: hash (es. SHA-256) cifrato con la chiave privata del mittente, inviato insieme a . Verifica: il ricevente calcola , decifra la firma con la chiave pubblica del mittente e confronta. Garantisce autenticità, integrità, non ripudio. Ruoli opposti rispetto alla cifratura riservata, che usa la pubblica del destinatario.
- Aritmetica modulare. , : , , , . Inverso: , esiste se : , . Divisione modulare: ; es. , . Divisione per 0 non ammessa.
- Logaritmo discreto. Se , . Esempio: , quindi . Non esiste algoritmo polinomiale noto: con di 2048 bit non si riesce a provare.
- Generazione chiavi RSA. 1) primi grandi; 2) ; 3) ; 4) con ; 5) , quindi . Chiave pubblica , segreta ; non si condividono.
- Cifratura e decifratura RSA. , , con . Eulero: , quindi .
- Esempio completo. , : , , , (perché ). Messaggio : ; decifratura . Calcolo con potenze ripetute: , , , , poi .
- Sicurezza RSA. Sicuro finché fattorizzare è difficile: di almeno 2048 bit (circa 617 cifre), e casuali, primi, della stessa dimensione.
- Padding casuale (obbligatorio, es. PKCS#1 v1.5:
00 02 [casuale] 00 [m]). Dà sicurezza semantica e rompe la struttura algebrica usata dagli attacchi sotto. Il blocco massimo resta , ma il messaggio utile si riduce. - Firma RSA. (con la privata), verifica (con la pubblica). Esempio: , , verifica . Se il messaggio diventa la verifica fallisce. Nella pratica si firma l'hash : con , .
- Malleabilità (RSA nudo). Mallory intercetta , calcola , Bob decifra e restituisce , Mallory ottiene . Esempio: , , , : , decifrato , quindi .
- Determinismo. Senza padding lo stesso dà sempre lo stesso . Contromisura: con casuale.
- Firma RSA nuda. Attacco: , il server firma , l'attaccante ottiene . Esempio: , , ottenuta senza chiederla.
- Dove sta la sicurezza. A livello applicazione la protezione è end-to-end e l'overhead è per dato; a livello trasporto o rete lo stesso meccanismo è condiviso da più applicazioni.
- TLS (su TCP) e SSL. Autentica gli estremi con il certificato, cifra i dati con una chiave di sessione simmetrica (usa e getta, una per connessione), garantisce integrità con MAC (Funzioni hash e crittografia simmetricaLa crittografia trasforma un messaggio in chiaro (plaintext) in un testo cifrato (ciphertext) con una chiave: C = E_ke(P), P = D_kd(C); può dare riservatezza, integrità e autenticazione. Attacchi: solo testo cifrato, testo in chiaro noto, testo in chiaro scelto, forza bruta. Funzione hash: mappa dati di qualsiasi lunghezza in un digest di lunghezza fissa; one-way (dato h è difficile trovare m con hash(m) = h) e resistente alle collisioni; famiglie MD (MD5 rotto per le collisioni nel 2004) e SHA (SHA-0 e SHA-1 rotti, SHA-2 il più usato, SHA-3); costruzione di Merkle-Damgård; usi: integrità e password. Crittografia simmetrica: stessa chiave segreta per cifrare e decifrare; Cesare (E_n(x) = x + n mod 26), Vigenère, Enigma; DES (blocchi da 64 bit, chiave da 56) e AES (blocchi da 128 bit, chiavi da 128, 192, 256); modi ECB (insicuro), CBC, CFB, OFB, CTR. Scambio della chiave con Diffie-Hellman: K = g^(xy) mod p. MAC e HMAC: autenticazione con chiave condivisa.Funzioni hash e crittografia simmetrica →). SSL 3.0 ha vulnerabilità note (POODLE): si sconsiglia; TLS è la versione raccomandata (TCP - connessione, affidabilità e controllo di flussoTCP (Transmission Control Protocol) è il protocollo di trasporto con connessione e affidabile: trasforma il servizio senza connessione e inaffidabile di IP in un flusso di byte ordinato, senza errori né duplicati. La connessione si apre con l'handshake a tre vie (SYN, SYN+ACK, ACK) e si chiude con tre o quattro segmenti (FIN). I byte sono numerati: il numero di sequenza è quello del primo byte del segmento, il numero di ACK (cumulativo) è il prossimo byte atteso. Il mittente può inviare $\min(\text{rwnd},\text{cwnd})$ byte non ancora confermati; rwnd (finestra del ricevitore, in un campo di 16 bit) è il controllo di flusso. L'errore si gestisce con checksum, ACK, timeout di ritrasmissione (RTO) e ritrasmissione rapida dopo tre ACK duplicati. Per usare tutto il canale la finestra deve valere almeno il prodotto banda-ritardo (BDP); il throughput massimo è $\text{MSS}\cdot W_{\max}/\text{RTT}$.TCP - connessione, affidabilità e controllo di flusso →).
- Sequenza TLS 1.0. 1) ClientHello (cifrari supportati); 2) ServerHello (cifrario scelto); 3) certificato del server + firma; 4) il client verifica il certificato; 5) client key exchange: chiave di sessione cifrata con la pubblica del server; 6) il server la decifra con la privata; 7) Client finished; 8) Server finished. Poi tutto è cifrato con la chiave di sessione.
- TLS 1.3 (Diffie-Hellman). Non si usa più la stessa coppia per autenticare e generare la chiave: un attaccante che registra il traffico e rompe la chiave privata del server leggerebbe tutte le sessioni. Con DH la privata serve solo a firmare. si genera dopo i primi due messaggi; il certificato è cifrato con ; la firma copre i messaggi (1)+(3). Esempio con , , , : , , . In TLS reale è di almeno 2048 bit (o curve ellittiche).
- Forward secrecy. è effimero e buttato via: la compromissione futura della chiave privata non rivela il traffico registrato.
- Costo in RTT. TLS 1.0: 2 RTT prima dei dati protetti; TLS 1.3: 1 RTT. HTTPS con ms: TCP 1 + TLS 1.3 1 + richiesta 1 = 3 RTT s (con TLS 1.0 s). Vedi Livello applicazione - HTTPIl livello applicazione è il più alto della pila: offre servizi all'utente con una connessione logica tra le due applicazioni e riceve servizi solo dal trasporto (DNS, HTTP, e-mail, FTP). Il Web (WWW, nato al CERN nel 1989) è un servizio client-server distribuito di pagine collegate da ipertesti; ogni pagina ha un URL protocollo://host:porta/percorso. HTTP: il client manda una richiesta, il server una risposta, su TCP (server sulla porta 80, client su una porta temporanea); senza stato. Messaggi di testo (riga di richiesta o di stato, intestazioni, riga vuota, corpo), metodi GET, POST, HEAD, PUT, DELETE, codici di stato 2xx-5xx. Una pagina con N oggetti incorporati richiede 2(N+1) RTT con connessioni non persistenti e (N+2) RTT con connessione persistente (trascurando la trasmissione). I cookie danno memoria al protocollo: Set-Cookie nella risposta, Cookie nelle richieste, file nel browser e base di dati nel sito. Un proxy (web cache) tiene le copie delle risposte recenti: meno carico sul server, meno traffico, meno ritardo.Livello applicazione - HTTP →.
- Handshake e record. L'handshake negozia parametri, autentica e stabilisce le chiavi; il protocollo di record protegge i dati in record indipendenti.
- DTLS (per UDP, Protocollo UDPUDP (User Datagram Protocol) è il protocollo di trasporto senza connessione e inaffidabile: rispetto a IP aggiunge soltanto la comunicazione processo-processo (numeri di porta) e un controllo d'errore facoltativo. L'intestazione è di soli 8 byte (porta sorgente, porta destinazione, lunghezza, checksum). Il checksum copre pseudo-intestazione (indirizzi IP, protocollo 17, lunghezza), intestazione e dati, ed è il complemento a uno della somma a 16 bit; se vale 0 significa "non calcolato", e un risultato 0 si trasmette come 0xFFFF. UDP non ha connessione, numeri di sequenza, controllo di flusso, di errore né di congestione: si sceglie per i messaggi brevi (DNS, DHCP, RIP, SNMP) e per le applicazioni in tempo reale, dove conta non aggiungere ritardo.Protocollo UDP →): overhead maggiore, non compatibile con il multicast IP. Modi: PreSharedKey, RawPublicKey, Certificate (X.509). IPsec: VPNUna VPN (Virtual Private Network) è una rete privata costruita sopra una rete pubblica (Internet): i nodi comunicano in sicurezza come se fossero in una rete privata, ottenendo autenticazione, riservatezza e integrità senza trovarsi fisicamente nella rete. Architettura: un host designato, il server VPN, ammesso dal firewall; chi sta fuori deve passare dal server e autenticarsi. Un pacchetto IP protetto (cifrato) viene incapsulato come carico di un altro pacchetto IP (IP tunneling). Due modi: IPsec (livello rete, nel kernel; protocolli AH ed ESP, modo tunnel o trasporto, Security Association unidirezionale identificata da SPI) e tunnel SSL/TLS (fuori dal kernel, in un'applicazione su TCP o UDP, il più popolare). Il client e il server VPN stabiliscono il tunnel, vi inoltrano i pacchetti IP destinati all'altro lato e, in ricezione, li rilasciano nella rete privata, usando un'interfaccia virtuale TUN (livello 3) o TAP (livello 2). Autenticazione reciproca: il client autentica il server con un certificato, il server il client con una chiave condivisa (per esempio la password). Una VPN nasconde anche l'indirizzo IP reale e permette di aggirare le restrizioni geografiche.VPN →.
- Servizi TLS. Autenticazione: certificati di una CA fidata, verificati dal client. Cifratura: asimmetrica per stabilire la connessione, simmetrica per i dati (riservatezza). Integrità: un MAC su ogni messaggio (Funzioni hash e crittografia simmetricaLa crittografia trasforma un messaggio in chiaro (plaintext) in un testo cifrato (ciphertext) con una chiave: C = E_ke(P), P = D_kd(C); può dare riservatezza, integrità e autenticazione. Attacchi: solo testo cifrato, testo in chiaro noto, testo in chiaro scelto, forza bruta. Funzione hash: mappa dati di qualsiasi lunghezza in un digest di lunghezza fissa; one-way (dato h è difficile trovare m con hash(m) = h) e resistente alle collisioni; famiglie MD (MD5 rotto per le collisioni nel 2004) e SHA (SHA-0 e SHA-1 rotti, SHA-2 il più usato, SHA-3); costruzione di Merkle-Damgård; usi: integrità e password. Crittografia simmetrica: stessa chiave segreta per cifrare e decifrare; Cesare (E_n(x) = x + n mod 26), Vigenère, Enigma; DES (blocchi da 64 bit, chiave da 56) e AES (blocchi da 128 bit, chiavi da 128, 192, 256); modi ECB (insicuro), CBC, CFB, OFB, CTR. Scambio della chiave con Diffie-Hellman: K = g^(xy) mod p. MAC e HMAC: autenticazione con chiave condivisa.Funzioni hash e crittografia simmetrica →).
- Server Hello. Contiene il livello di protocollo, i parametri crittografici scelti dall'elenco del client, un numero casuale con data e ora, l'identificatore di sessione, il metodo di compressione e il certificato con identità e chiave pubblica.
- Sicurezza RSA: scelte di generazione. e si scelgono a caso e della stessa dimensione (primi da 1500 a 3000 bit) per evitare attacchi noti; molte altre proprietà della generazione e della decifratura, se implementate male, aprono vulnerabilità.
- Errori tipici: chiavi pubblica e privata scambiate (riservatezza = pubblica del destinatario; firma = privata del mittente); RSA senza padding; non coprimo con ; dimenticare ; dimenticare che il certificato lega identità e chiave (senza, un uomo in mezzo offre la propria chiave); credere che in TLS 1.3 la chiave di sessione sia cifrata con la pubblica del server; confondere TLS (TCP) con DTLS (UDP); pensare che RSA cifri un file intero (si cifra la chiave di sessione).