Funzioni hash e crittografia simmetrica
In questa pagina 5
In questa pagina 3
La crittografia
Definizione (crittografia). La crittografia è la cifratura (encryption) e la decifratura (decryption) di messaggi in codice segreto. Può dare riservatezza, integrità e autenticazione. Converte un messaggio (testo in chiaro, plaintext) in un codice segreto (testo cifrato, ciphertext) usando una chiave, in modo che senza la chiave giusta non si possa fare la conversione inversa.
Lo schema è: il mittente cifra con la chiave di cifratura , il testo cifrato passa per il canale, il destinatario decifra con la chiave di decifratura :
Attacchi ai sistemi crittografici.
- Solo testo cifrato (ciphertext only): l'attaccante intercetta il traffico e deve analizzare i dati cifrati con tecniche di crittoanalisi.
- Testo in chiaro noto (known plaintext): l'attaccante ha accesso al testo in chiaro e al corrispondente testo cifrato.
- Testo in chiaro scelto (chosen plaintext): l'attaccante riesce a far inserire nel sistema sorgente un messaggio scelto da lui.
- Forza bruta (brute force): il testo cifrato viene analizzato al computer provando velocemente molte (o tutte) le combinazioni di chiavi, aiutandosi con debolezze note (per esempio le regolarità di una lingua).
Proprietà (ricerca esaustiva). Provare tutte le chiavi di bit richiede in media tentativi: ogni bit in più raddoppia il lavoro.
Perché : le chiavi possibili sono (ogni bit vale o , scelte per bit, principio di moltiplicazionele scelte indipendenti si moltiplicanoCalcolo combinatorio per la probabilità →) e quella giusta è, con uguale probabilità, in una qualunque delle posizioni dell'elenco: provando le chiavi in ordine, in media la si trova a metà, dopo tentativi (Valore attesoIl valore atteso E[X] = Σ x p_X(x) è la media dei valori di X pesata con le loro probabilità (esiste se la serie converge assolutamente); per una funzione g vale E[g(X)] = Σ g(x) p_X(x) senza trovare la legge di g(X), ed E è lineare: E[aX + bY + c] = aE[X] + bE[Y] + c.Valore atteso → di una posizione uniforme su valori). Nel caso peggiore sono .
Esempio. Con chiavi al secondo, il DES ( chiavi) richiede in media s, circa 10 ore (); AES-128 () richiede in media s, cioè anni (per confronto, l'universo ha anni). Il rapporto tra i due è : ogni bit in più raddoppia, bit in più moltiplicano per .
Due famiglie. La crittografia asimmetrica (a chiave pubblica) usa chiavi diverse per cifrare e decifrare, e dalla chiave pubblica è computazionalmente impossibile ricavare la privata (Crittografia asimmetrica, RSA e TLSCrittografia asimmetrica (a chiave pubblica): chiave di cifratura pubblica v_B, chiave di decifratura privata s_B, matematicamente legate; C = E_vB(P), P = D_sB(C); dà riservatezza. I certificati digitali, emessi da una Certificate Authority e firmati con la sua chiave privata, legano un'identità a una chiave pubblica. Firma digitale: hash del messaggio cifrato con la chiave privata; garantisce autenticità, integrità e non ripudio. RSA: si scelgono due primi grandi p e q, N = pq, phi(N) = (p-1)(q-1), e coprimo con phi(N), d = e^(-1) mod phi(N); chiave pubblica (N, e), segreta (N, d); cifratura c = m^e mod N, decifratura m = c^d mod N con m < N (teorema di Eulero); sicura finché la fattorizzazione è difficile (N di almeno 2048 bit); il padding casuale (PKCS#1 v1.5: 00 02 [casuale] 00 [m]) difende da malleabilità e determinismo. La firma RSA è s = m^d mod N, verificata con s^e mod N. TLS (su TCP) autentica gli estremi con il certificato, cifra i dati con una chiave di sessione simmetrica e garantisce l'integrità con i MAC; da TLS 1.0 a 1.3 la chiave si ricava con Diffie-Hellman e l'handshake si accorcia. DTLS è la versione per UDP.Crittografia asimmetrica, RSA e TLS →). La crittografia simmetrica (a chiave privata o segreta) usa la stessa chiave per cifrare e decifrare: la chiave deve restare segreta e serve un meccanismo aggiuntivo per distribuirla in modo sicuro (un canale separato o uno scambio di chiavi).
Funzioni hash
Le funzioni hash sono mattoni fondamentali della crittografia. Producono una firma di lunghezza fissa che si può usare per identificare un file. Casi d'uso: autenticazione con password, conservazione dell'integrità, blockchain.
Definizione (funzione hash). Qualsiasi funzione che mappa dati di dimensione arbitraria in dati di dimensione fissa. I valori restituiti si chiamano valori hash, digest o hash.
Esempio. è una funzione hash: porta qualunque in un numero di bit (da 0 a 999: , 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 →): e . Però non è one-way, perché dato si trovano subito tutti gli .
Definizione (funzione hash one-way). Una funzione hash che soddisfa due proprietà:
- proprietà one-way: dato , è "difficile" trovare tale che . La funzione non è invertibile (la corrispondenza è molti-a-uno), ma deve essere difficile trovare un qualsiasi valido;
- resistenza alle collisioni: è "difficile" trovare e diversi tali che .
Un'applicazione: il gioco pari e dispari. Versione 1: io scelgo un numero e tu scegli un numero; tu mi dici per primo il tuo; poi io ti dico il mio; se la somma è pari vinco io. Non è equo: io posso scegliere il mio numero dopo aver sentito il tuo, e quindi vinco sempre.
Versione 2, con l'hash: io scelgo , tu scegli .
- Io ti dico .
- Tu mi dici il tuo numero .
- Io ti dico ; tu verifichi che sia coerente con .
- Se la somma è pari vinco io.
Io devo rivelare l'hash prima di te, ma la proprietà one-way mi rende il gioco equo: tu non sai trovare il numero che ha generato quell'hash, e io non posso cambiare dopo (per la resistenza alle collisioni). Rischio: la forza bruta: provare tutti i numeri finché si trova quello giusto. Per questo il numero va scelto grande (per esempio di 256 bit): con tra e il lavoro medio di chi indovina è circa tentativi, e con è fuori portata (stesso conto della ricerca esaustiva sopra).
Esempio. Se e l'hash è SHA-256 della stringa 7, che inizia con 7902699b…, e i numeri possibili sono da 1 a 100, chi riceve l'hash prova i 100 candidati e trova al primo colpo (verificato con Python): serve uno spazio di scelta enorme.
Funzioni hash popolari.
- Serie MD (Message Digest, di Ron Rivest): MD2, MD4, MD5, MD6. MD2 e MD4 sono stati rotti e sono obsoleti. MD5 è diventato una delle più usate, ma la sua resistenza alle collisioni è stata rotta nel 2004; si usa ancora quando serve solo la proprietà one-way. MD6 non è diventato popolare. MD5 dà 128 bit.
- Serie SHA (Secure Hash Algorithm, del NIST): SHA-0, SHA-1, SHA-2 e SHA-3. SHA-0 e SHA-1 sono stati rotti. SHA-2 non è mai stato rotto; ma poiché il suo principio di funzionamento è lo stesso di SHA-1 e MD5, è stato sviluppato SHA-3. Nonostante SHA-3 sia uno standard, oggi il più usato è SHA-2 (per esempio SHA-256, che dà 256 bit = 32 byte).
Come funzionano: la costruzione di Merkle-Damgård. MD5, SHA-1 e SHA-2 usano lo stesso metodo di costruzione.
- I dati d'ingresso sono divisi in blocchi di dimensione fissa (l'ultimo blocco è completato con un riempimento, padding).
- Ogni blocco e l'uscita dell'iterazione precedente entrano in un blocco di compressione (la prima iterazione usa un vettore iniziale, IV).
- L'uscita dell'ultima iterazione è l'hash.
- Gli standard differiscono per la specifica funzione di compressione.
Esempio (SHA-256). I blocchi sono di 512 bit; il riempimento aggiunge un bit 1, degli zeri e la lunghezza del messaggio su 64 bit. Un messaggio di bit richiede bit tra dati, bit 1 e lunghezza, e questi vanno distribuiti in blocchi interi da : il numero di blocchi è (il simbolo è l'arrotondamento per eccesso, perché l'ultimo blocco si riempie di zeri). Un messaggio abc ( byte bit) sta in blocco; un file di 1000 byte ( bit) richiede blocchi, e l'hash resta di 256 bit.
Verifica dell'integrità. Cambiare un solo carattere (o anche un solo bit) dei dati originali cambia completamente l'hash, e nessuno può dire quanto siano vicini i due ingressi. Invece di conservare un file grande, si può conservare il suo hash, di dimensione fissa (32 byte per SHA-256): conservare l'hash equivale a conservare un duplicato sicuro. Molte fonti affidabili pubblicano l'hash insieme al file: dopo lo scaricamento si può verificarlo.
Esempio. SHA-256 della stringa ciao inizia con b133a0c0e9bee3be…; SHA-256 di ciap (una lettera diversa) inizia con 433a76b7fe6e8c73…: i due digest differiscono in 135 bit su 256, circa metà (verificato con Python). Perché metà: un buon hash si comporta come se ogni bit dell'uscita cambiasse con probabilità in modo indipendente (effetto valanga), quindi il numero di bit diversi è una variabile binomialenumero di successi in n prove indipendenti con la stessa probabilitàProve ripetute e modello binomiale → con , : media , deviazione standard , e dista solo dalla media. Trovare una preimmagine costa circa tentativi: ogni tentativo indovina con probabilità , e il numero di tentativi fino al primo successo ha distribuzione geometricail numero di prove fino al primo successo, con media 1/pDistribuzione geometrica → con media . Trovare una collisione costa invece circa , per il paradosso del compleanno (sezione seguente).
Password. Per accedere a un account l'utente deve dire un segreto (la password), ma questa non si può conservare in chiaro. Serve un hash per conservare le password in modo che nessuno possa sapere qual è (Linux le conserva in /etc/shadow); quando l'utente fornisce una password, si verifica confrontando l'hash della password data con quello della password memorizzata.
Il paradosso del compleanno e le collisioni
Una collisione è una coppia con lo stesso hash. Se l'hash ha bit, i valori possibili sono . Quanti messaggi bisogna provare per trovare una qualsiasi coppia che collide? Meno di quanto si pensi: è lo stesso conteggio del paradosso del compleanno ( persone, giorni).
Si calcola la probabilità del complementare, cioè che tutti gli valori siano distinti. Il primo valore è libero; il secondo deve evitare il primo: probabilità ; il terzo deve evitare i primi due: (le scelte sono indipendenti, quindi le probabilità si moltiplicano: Indipendenza di eventiA e B sono indipendenti se P(A ∩ B) = P(A) P(B), cioè se sapere che uno si è verificato non cambia la probabilità dell'altro; l'indipendenza passa ai complementari, non va confusa con l'incompatibilità, e per più eventi va richiesta su ogni sottofamiglia.Indipendenza di eventi → e Probabilità condizionataLa probabilità di A sapendo che si è verificato B è P(A ∣ B) = P(A ∩ B) / P(B), con P(B) > 0; è una nuova misura di probabilità, e da essa seguono la regola del prodotto e la regola della catena.Probabilità condizionata → con la formula del prodotto), e così via: Per piccolo rispetto a si usa per piccolo (Sviluppi di Mac-Laurin notevoliTabella degli sviluppi di Mac-Laurin da sapere a memoria (e^x, sin, cos, log(1+x), (1+x)^alpha, arctan, sinh, cosh, tan) e regole per combinarli: algebra degli o piccoli, prodotti, funzioni composte, quanti termini tenere.Sviluppi di Mac-Laurin notevoli →: ): ogni fattore diventa e il prodotto . La somma (SommatorieIl simbolo di sommatoria, le sue proprietà (linearità, additività, cambio di indice) e le somme notevoli di Gauss e geometrica.Sommatorie →) dà Si impone : , quindi e Il numero di valori necessari è dell'ordine della radice di , non di . Questo spiega la differenza tra preimmagine e collisione: . Esempi:
| caso | per | |
|---|---|---|
| compleanni | persone (; l'approssimazione dà ) | |
| hash a 32 bit | circa messaggi | |
| MD5 (128 bit) | circa | |
| SHA-256 (256 bit) | circa |
Con persone: , quindi . Con persone la probabilità è già (esatta ). Con tentativi a hash al secondo servirebbero s, circa giorni: ecco perché 128 bit non bastano più per resistere alle collisioni, mentre è irraggiungibile. Per questo un hash di bit offre sicurezza contro le collisioni e contro la preimmagine. La stessa matematica descrive le collisioni nelle Tabelle hashTabella hash per implementare una mappa: funzione hash = hash code + compression function, bucket array, separate chaining; hash code per numeri e stringhe (polynomial, cyclic shift), division e MAD; load factor, complessità al caso pessimo Theta(n) e medio O(1+lambda), rehashing; esempio svolto con inserimenti e collisioni.Tabelle hash → a bucket: dopo circa inserimenti è probabile che due chiavi condividano un bucket.
Grafico interattivo: Paradosso del compleanno: probabilità che tra n persone (M = 365 giorni) almeno due compleanni coincidano, 1 − exp(−n(n−1)/730). Il 50% si supera a n = 23; a n = 57 si arriva a circa il 99%
Per un hash qualsiasi la curva è la stessa se l'asse orizzontale è (circa per il , circa per il ).
Crittografia simmetrica
Definizione (crittografia simmetrica). Detta anche a chiave privata. Usa la stessa chiave per cifrare e decifrare: , . Garantisce riservatezza, integrità e autenticazione dei messaggi. I nodi che comunicano devono condividere una chiave segreta.
La crittografia simmetrica usa il principio del progetto aperto (open design): il nodo mittente A usa un algoritmo di cifratura concordato con la sua copia della chiave condivisa; il nodo ricevente B decifra con l'algoritmo corrispondente e la sua copia della chiave; cifratura e decifratura sono funzioni inverse; chiunque altro non ha la chiave e non può ricostruire il testo in chiaro. La segretezza sta tutta nella chiave, non nell'algoritmo.
Cifrari storici
La storia della cifratura risale al 1900 a.C. (geroglifici egizi).
Cifrario di Cesare. Secondo Svetonio, Giulio Cesare cifrava i messaggi militari con uno spostamento di tre lettere. Si può usare qualsiasi spostamento, ruotando l'alfabeto come un buffer circolare. Per una lettera in posizione (A = 0, ..., Z = 25; il riporta il risultato nell'alfabeto, come nell'aritmetica modulareil resto della divisione per 26: dopo la Z si ricomincia da ACrittografia asimmetrica, RSA e TLS → delle note sulla crittografia a chiave pubblica):
Esempio. Con : ATTACCO DWWDFFR (, , , ); per decifrare si sposta di (la torna a ; per una lettera come si ha , cioè si prende il resto non negativo). Provando la chiave sbagliata al posto di sulla stessa parola si ottiene XQQXZZL, senza senso. Le chiavi possibili sono solo 25: si provano tutte. Un cifrario a sostituzione monoalfabetica (una lettera qualunque al posto di un'altra) ha chiavi ( scelte per la prima lettera, per la seconda, ... : le permutazioni, Fattoriale e coefficienti binomialiFattoriale, permutazioni, disposizioni, combinazioni e coefficiente binomiale n su k, con il triangolo di Tartaglia.Fattoriale e coefficienti binomiali →; ), troppe per provarle tutte, ma si rompe lo stesso con l'analisi delle frequenze delle lettere.
Il complotto di Babington. Maria, regina di Scozia nel XVI secolo, era prigioniera della cugina Elisabetta I d'Inghilterra. Anthony Babington progettava di liberarla e di assassinare Elisabetta; scrisse a Maria una lettera cifrata con un nomenclator (sostituzione + parole in codice). Ma il matematico Phelippes, assoldato da Sir Walsingham, decifrò il codice e il complotto fu scoperto: Maria fu decapitata nel 1587.
Vigenère: "le chiffrage indéchiffrable". Nel Rinascimento dominavano i decifratori, grazie all'analisi delle frequenze: spostamento e sostituzione erano facili da rompere. Da Leon Battista Alberti (1404) l'idea di usare più di un cifrario; raffinata da Giovan Battista Bellaso (1553) e Blaise de Vigenère, con 26 codici possibili e una chiave che deve essere nota alla destinazione.
Esempio. Con chiave LEMON ripetuta, ATTACKATDAWN LXFOPVEFRNHR: ogni lettera è spostata del valore della lettera corrispondente della chiave (, , , , , , ...). La stessa lettera A diventa L, O, E: l'analisi delle frequenze semplice non funziona più.
Enigma. La crittografia ebbe un ruolo importante nella seconda guerra mondiale: gli storici dicono che ne abbreviò la durata e ne cambiò perfino l'esito. Arthur Scherbius iniziò a sviluppare Enigma nel 1918, combinando le idee di Alberti e di Vigenère. La prima versione funzionante fu violata nel 1932 dal controspionaggio polacco con la Bomba, una macchina di Marian Rejewski; i tedeschi migliorarono la macchina aggiungendo combinazioni; la ricerca passò a Bletchley Park, nel Regno Unito, dove il giovane Alan Turing contribuì a modificare e migliorare la Bomba.
DES e AES
DES (Data Encryption Standard) è un cifrario a blocchi: elabora i dati in blocchi di 64 bit, con chiave di 56 bit (la chiave in ingresso è di 64 bit, ma 8 sono per il controllo degli errori e vengono scartati). Approvato come standard nel 1976, progettato da NSA e IBM. La chiave corta fa sì che oggi si possa rompere con la forza bruta: nel 1999 un gruppo lo violò in una gara in 22 ore, usando molti PC. Il Triple DES (DES applicato tre volte) risolve il problema della lunghezza della chiave, ma è costoso in calcolo; è stato sostituito dall'AES.
AES (Advanced Encryption Standard) è stato definito pubblicamente (senza NSA) nel 1997: cifrario a blocchi simmetrico adattabile a più lunghezze di chiave. Blocco fisso da 128 bit (contro i 64 del DES); chiavi da 128, 192 o 256 bit.
| cifrario | blocco | chiave | stato |
|---|---|---|---|
| DES | 64 bit | 56 bit | rotto con la forza bruta |
| Triple DES | 64 bit | tre DES | sostituito dall'AES |
| AES | 128 bit | 128, 192, 256 bit | standard attuale |
Modi di cifratura
Usare i blocchi, nella versione ingenua, non sembra sicuro: due blocchi di testo in chiaro uguali danno due blocchi cifrati uguali. Bisogna rendere diversi i blocchi cifrati anche se i blocchi in chiaro sono uguali: bisogna rendere diverso almeno uno degli ingressi. Esistono molte soluzioni, i modi di cifratura: Electronic Codebook (ECB), Cipher Block Chaining (CBC), Propagating CBC (PCBC), Cipher Feedback (CFB), Output Feedback (OFB), Counter (CTR), ...
Notazione: blocco in chiaro , blocco cifrato , blocco cifrato precedente, funzione di cifratura con chiave , vettore di inizializzazione.
- ECB: ogni blocco è mappato in un codice specifico senza altro, (ricorda il DES o l'AES usati da soli). Due blocchi in chiaro uguali danno blocchi cifrati uguali; nessuna casualità tra i blocchi (la struttura del testo in chiaro si vede); molto vulnerabile ad alcuni attacchi, specialmente per grandi insiemi di dati come immagini e dati strutturati. Insicuro.
- CBC: invece di cifrare ogni blocco da solo, concatena i blocchi: . Ogni blocco in chiaro è messo in XOR con il blocco cifrato precedente (il primo con l'IV, casuale). Anche se due blocchi in chiaro sono uguali, i cifrati sono diversi; lo stesso testo cifrato con IV diversi dà testi diversi; l'IV deve essere imprevedibile e unico per ogni sessione di cifratura. La cifratura è sequenziale (non parallelizzabile).
- CFB: cifra il blocco cifrato precedente (o l'IV all'inizio) e lo mette in XOR con il testo in chiaro: . Diventa un cifrario a flusso (lo XOR è bit a bit e viene dopo la cifratura); può cominciare senza aspettare l'intero messaggio (bene per il tempo reale); cifra dati di qualsiasi lunghezza, non solo multipli del blocco. Un errore di trasmissione si propaga su più blocchi; difficile da parallelizzare, come il CBC.
- OFB: invece di cifrare il blocco cifrato precedente, cifra l'uscita precedente della funzione di cifratura (partendo dall'IV): , , . Resistente agli errori di trasmissione (è colpito solo il blocco corrente); cifratura e decifratura usano entrambe la sola funzione di cifratura; il flusso di chiave (keystream) si può precalcolare, perché non dipende da testo in chiaro e cifrato; l'IV deve essere unico e imprevedibile.
- CTR: nessuna correlazione con il blocco seguente. Cifra i blocchi separatamente, usando ogni volta un IV diverso (che cresce di uno a ogni blocco: per questo si chiama counter): . Un errore di trasmissione colpisce solo il blocco corrispondente; è parallelizzabile (ogni blocco si cifra e decifra da solo).
Esempio (giocattolo). Cifrario a blocchi di 8 bit (non è un cifrario sicuro, serve solo per vedere come lavorano i modi), testo in chiaro a blocchi e . Il simbolo è lo XOR bit a bit (Algebra di Boole e porte logicheVariabili booleane, operatori AND, OR, NOT e derivati (NAND, NOR, XOR, XNOR) con tabelle di verità; assiomi e teoremi dell'algebra di Boole, De Morgan; porte logiche e completezza di NAND e NOR; semplificazione algebrica con esempio.Algebra di Boole e porte logiche →: se i due bit sono diversi, se uguali), per esempio (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 →).
Passaggi, blocco per blocco (ciascun risultato alimenta il successivo):
- ECB: per tutti e tre i blocchi uguali; .
- CBC: ; ; ; .
- CFB: ; ; ; .
- OFB: il flusso di chiave non dipende dal testo: , , , ; poi : , , , .
- CTR: , , , ; : , , , .
| modo | blocchi cifrati | calcolo del primo blocco |
|---|---|---|
| ECB | ||
| CBC | ||
| CFB | ||
| OFB | ; poi | |
| CTR | ; poi |
In ECB i tre blocchi uguali si vedono; negli altri modi i blocchi cifrati sono tutti diversi anche se i primi tre blocchi in chiaro sono uguali. (Calcolati e riverificati con Python, anche la decifratura.)
Come scambiarsi la chiave
I nodi che usano la crittografia simmetrica devono stabilire in modo sicuro le chiavi segrete. Con persone che vogliono parlare a coppie in modo riservato servono chiavi: ogni persona ne condivide una con ciascuna delle altre , e ogni chiave è contata due volte (una da ciascun estremo), quindi si divide per (Fattoriale e coefficienti binomialiFattoriale, permutazioni, disposizioni, combinazioni e coefficiente binomiale n su k, con il triangolo di Tartaglia.Fattoriale e coefficienti binomiali →); per sono . La crescita è quadratica, mentre la crittografia asimmetrica richiede una sola coppia di chiavi per persona, in tutto:
Grafico interattivo: Numero di chiavi da gestire per n persone: crittografia simmetrica, n(n−1)/2 chiavi segrete (una per coppia), e asimmetrica, n coppie di chiavi (una per persona)
Per : chiavi segrete contro coppie. Due strade:
- scambiare la chiave con la crittografia a chiave pubblica, prima della trasmissione vera e propria; ma implementare un sistema a chiave pubblica può essere troppo oneroso se serve solo per lo scambio della chiave;
- costruire insieme la chiave (Diffie e Hellman): si esegue passo passo un algoritmo specificato, scambiando risultati intermedi e parametri su un canale insicuro; conoscendo i risultati intermedi dell'altro, entrambi i nodi calcolano la stessa chiave segreta, senza averla mai scambiata.
Scambio di chiavi Diffie-Hellman. Alice e Bob si accordano su:
- un gruppo ciclico di ordine : un grande numero primo (per esempio di 2048 bit);
- un generatore : un piccolo numero primo (per esempio 2 o 3).
Generare questi parametri è costoso, quindi si fa in anticipo e gli stessi e si riusano più volte; spesso si usano anche parametri standardizzati (RFC 3526, 2003, e RFC 5114, 2008). Poi A e B scelgono a caso interi positivi e .
Formula (Diffie-Hellman). A manda a B ; B manda ad A . A calcola , B calcola . Si ha : la stessa chiave condivisa.
Esempio (, ). : . : . Alice calcola ; Bob calcola . Chiave condivisa (verificato con Python). Passaggi con le potenze ripetute (si riduce modulo a ogni prodotto): , , ; ; . Poi , quindi ; e : , , con si ha . Le due strade danno lo stesso perché . Un ascoltatore conosce , , , ; per ottenere dovrebbe ricavare da , cioè il logaritmo discreto ( qui, trovato provando tutti i valori: con da 2048 bit non è fattibile).
Per un osservatore che vede il protocollo, l'informazione è molta, ma non può calcolare senza conoscere o . Se conoscessimo e la potenza intera, ricavare da sarebbe facile; farlo da è il problema del logaritmo discreto, per il quale non si conosce alcun algoritmo in tempo polinomiale (le slide lo descrivono come un problema NP-hard). Diffie-Hellman da solo non autentica le parti: serve la firma o il certificato (Crittografia asimmetrica, RSA e TLSCrittografia asimmetrica (a chiave pubblica): chiave di cifratura pubblica v_B, chiave di decifratura privata s_B, matematicamente legate; C = E_vB(P), P = D_sB(C); dà riservatezza. I certificati digitali, emessi da una Certificate Authority e firmati con la sua chiave privata, legano un'identità a una chiave pubblica. Firma digitale: hash del messaggio cifrato con la chiave privata; garantisce autenticità, integrità e non ripudio. RSA: si scelgono due primi grandi p e q, N = pq, phi(N) = (p-1)(q-1), e coprimo con phi(N), d = e^(-1) mod phi(N); chiave pubblica (N, e), segreta (N, d); cifratura c = m^e mod N, decifratura m = c^d mod N con m < N (teorema di Eulero); sicura finché la fattorizzazione è difficile (N di almeno 2048 bit); il padding casuale (PKCS#1 v1.5: 00 02 [casuale] 00 [m]) difende da malleabilità e determinismo. La firma RSA è s = m^d mod N, verificata con s^e mod N. TLS (su TCP) autentica gli estremi con il certificato, cifra i dati con una chiave di sessione simmetrica e garantisce l'integrità con i MAC; da TLS 1.0 a 1.3 la chiave si ricava con Diffie-Hellman e l'handshake si accorcia. DTLS è la versione per UDP.Crittografia asimmetrica, RSA e TLS →).
Simmetrica e asimmetrica a confronto
| aspetto | simmetrica | asimmetrica |
|---|---|---|
| uso delle chiavi | una sola chiave condivisa per cifrare e decifrare | coppia di chiavi pubblica e privata |
| velocità | più veloce (algoritmi più semplici, chiavi più corte) | più lenta (algoritmi più complessi, chiavi più lunghe) |
| gestione delle chiavi | serve la distribuzione sicura della chiave condivisa a tutti | la chiave privata non si condivide; la pubblica si può distribuire liberamente |
| sicurezza | meno sicura se la chiave condivisa è intercettata o diffusa | più sicura, perché la chiave privata non è mai condivisa |
| costo di calcolo | basso, efficiente per cifrare grandi quantità di dati | alto, adatta ai primi scambi (handshake) sicuri |
Autenticazione: MAC e HMAC
Definizione (MAC). Un codice di autenticazione del messaggio (Message Authentication Code) realizza l'autenticazione con una chiave segreta condivisa (anche diversa da quella di cifratura). Il nodo mittente lo calcola con una funzione nota e la chiave segreta, ottenendo un valore breve e di lunghezza fissa, l'autenticatore (detto anche tag), che viene aggiunto al messaggio.
Gli algoritmi che generano il MAC hanno la proprietà che non si può alterare il messaggio senza cambiare il tag. Alla ricezione B usa la chiave segreta di autenticazione per calcolare il MAC sul contenuto del messaggio e lo confronta con quello ricevuto. Se coincidono, il ricevente sa che il messaggio non è stato manomesso e che A è l'unica altra parte che possiede la chiave usata per generare il MAC. Per la sicurezza dell'autenticazione deve essere computazionalmente impossibile calcolare un tag valido di un messaggio senza conoscere la chiave; per essere utile, il calcolo deve essere relativamente semplice conoscendo la chiave. Una via comune per calcolare un MAC è l'hash.
Formula (HMAC). L'HMAC (Keyed-Hash MAC) è l'algoritmo standard per il MAC basato su hash. Con la dimensione del blocco usato dalla funzione hash (di solito 64 byte) e la chiave di lunghezza variabile (completata con zeri fino a ), si usano due hash combinati:
dove (hash interno) e (hash esterno) sono valori fissi ( e ) ripetuti volte. Perché due hash e non semplicemente : con le funzioni costruite alla Merkle-Damgård (MD5, SHA-1, SHA-2) chi conosce può calcolare l'hash di continuando la catena dallo stato finale, senza conoscere (length extension); l'hash esterno dell'HMAC chiude la catena e lo impedisce. Con e diversi, le due chiavi usate nei due hash sono diverse anche se partono dalla stessa .
Esempio. Con chiave-segreta e bonifico:100:IT60, HMAC-SHA256 bc838925c97eca28…; per bonifico:900:IT60 si ottiene dadd0ebe877f0fc5…. Chi cambia 100 in 900 non sa ricalcolare il tag giusto senza . Con il solo SHA-256 (4a8354a1a8c53cb1… per ) l'avrebbe saputo ricalcolare. (La formula è stata verificata calcolando a mano ipad, opad e i due SHA-256: coincide con la libreria standard.)
Proprietà (MAC contro firma digitale).
aspetto MAC firma digitale si basa su chiave simmetrica (segreto condiviso) chiavi asimmetriche (privata e pubblica) proprietà della chiave condivisa tra mittente e destinatario privata del mittente, pubblica di tutti come funziona mittente e destinatario usano la stessa chiave segreta per generare e verificare il mittente firma con la chiave privata, il destinatario verifica con la pubblica scopo principale integrità + autenticazione integrità + autenticazione + non ripudio
La firma è spiegata in Crittografia asimmetrica, RSA e TLSCrittografia asimmetrica (a chiave pubblica): chiave di cifratura pubblica v_B, chiave di decifratura privata s_B, matematicamente legate; C = E_vB(P), P = D_sB(C); dà riservatezza. I certificati digitali, emessi da una Certificate Authority e firmati con la sua chiave privata, legano un'identità a una chiave pubblica. Firma digitale: hash del messaggio cifrato con la chiave privata; garantisce autenticità, integrità e non ripudio. RSA: si scelgono due primi grandi p e q, N = pq, phi(N) = (p-1)(q-1), e coprimo con phi(N), d = e^(-1) mod phi(N); chiave pubblica (N, e), segreta (N, d); cifratura c = m^e mod N, decifratura m = c^d mod N con m < N (teorema di Eulero); sicura finché la fattorizzazione è difficile (N di almeno 2048 bit); il padding casuale (PKCS#1 v1.5: 00 02 [casuale] 00 [m]) difende da malleabilità e determinismo. La firma RSA è s = m^d mod N, verificata con s^e mod N. TLS (su TCP) autentica gli estremi con il certificato, cifra i dati con una chiave di sessione simmetrica e garantisce l'integrità con i MAC; da TLS 1.0 a 1.3 la chiave si ricava con Diffie-Hellman e l'handshake si accorcia. DTLS è la versione per UDP.Crittografia asimmetrica, RSA e TLS →. Il MAC garantisce integrità e autenticazione tra chi condivide la chiave, ma non il non ripudio: anche il destinatario avrebbe potuto generare lo stesso tag.
Errori comuni
- Credere che un hash sia una cifratura: non si inverte e non ha chiave. Né lo è base64 (Posta elettronica - SMTP, POP3 e IMAPLa posta elettronica è una transazione a senso unico: non ha senso che il destinatario tenga un server sempre acceso, quindi si usano server intermedi. Servono due User Agent (UA, il programma dell'utente), due programmi client/server di spinta (MTA, protocollo SMTP: mittente-suo server e server-server) e un programma client/server di tiro (MAA, POP3 o IMAP4: server del destinatario-destinatario). SMTP usa TCP porta 25, comandi HELO, MAIL FROM, RCPT TO, DATA, QUIT e risposte a tre cifre (220 pronto, 250 ok, 354 inizia il testo, 221 chiusura, 421 non disponibile) in tre fasi: apertura, trasferimento, chiusura. POP3 (porta 110): utente e password, poi elenca e scarica i messaggi uno a uno; non organizza la posta sul server. IMAP4 aggiunge intestazioni prima del download, ricerca, download parziale, cartelle sul server. MIME permette di spedire dati non ASCII (immagini, video, lettere accentate) traducendoli in ASCII a 7 bit, per esempio in base64 (3 byte diventano 4 caratteri).Posta elettronica - SMTP, POP3 e IMAP →).
- Usare ECB: i blocchi uguali danno cifrati uguali. Usare lo stesso IV più volte in CBC, OFB o CTR.
- Pensare che cifrare dia anche integrità: serve un MAC (o una firma).
- Dire che MD5 e SHA-1 sono sicuri: le collisioni sono note.
- Confondere la chiave di 56 bit del DES con quella di 64 bit in ingresso (8 bit servono al controllo).
- Credere che Diffie-Hellman cifri dei messaggi: stabilisce solo una chiave condivisa, e da solo non autentica.
Versione ripasso
- Crittografia. Converte il testo in chiaro (plaintext) in testo cifrato (ciphertext) con una chiave: , . Può dare riservatezza, integrità e autenticazione.
- Attacchi. Solo testo cifrato (crittoanalisi); testo in chiaro noto; testo in chiaro scelto (l'attaccante fa cifrare un messaggio scelto da lui); forza bruta, aiutata da debolezze note come le regolarità della lingua.
- Ricerca esaustiva. Provare tutte le chiavi di bit costa in media tentativi: ogni bit in più raddoppia il lavoro. Con chiavi al secondo: DES () circa s, cioè circa 10 ore; AES-128 circa anni.
- Due famiglie. Asimmetrica: chiavi diverse, dalla pubblica non si ricava la privata (Crittografia asimmetrica, RSA e TLSCrittografia asimmetrica (a chiave pubblica): chiave di cifratura pubblica v_B, chiave di decifratura privata s_B, matematicamente legate; C = E_vB(P), P = D_sB(C); dà riservatezza. I certificati digitali, emessi da una Certificate Authority e firmati con la sua chiave privata, legano un'identità a una chiave pubblica. Firma digitale: hash del messaggio cifrato con la chiave privata; garantisce autenticità, integrità e non ripudio. RSA: si scelgono due primi grandi p e q, N = pq, phi(N) = (p-1)(q-1), e coprimo con phi(N), d = e^(-1) mod phi(N); chiave pubblica (N, e), segreta (N, d); cifratura c = m^e mod N, decifratura m = c^d mod N con m < N (teorema di Eulero); sicura finché la fattorizzazione è difficile (N di almeno 2048 bit); il padding casuale (PKCS#1 v1.5: 00 02 [casuale] 00 [m]) difende da malleabilità e determinismo. La firma RSA è s = m^d mod N, verificata con s^e mod N. TLS (su TCP) autentica gli estremi con il certificato, cifra i dati con una chiave di sessione simmetrica e garantisce l'integrità con i MAC; da TLS 1.0 a 1.3 la chiave si ricava con Diffie-Hellman e l'handshake si accorcia. DTLS è la versione per UDP.Crittografia asimmetrica, RSA e TLS →). Simmetrica: stessa chiave segreta per cifrare e decifrare, che va distribuita in modo sicuro.
Funzioni hash
- Definizione. Mappa dati di lunghezza arbitraria in un valore di lunghezza fissa (digest). Proprietà one-way: dato è difficile trovare con hash. Proprietà resistenza alle collisioni: è difficile trovare con lo stesso hash.
- Non è one-way. è una funzione hash a 10 bit, ma dato si trovano subito tutti gli .
- Gioco pari/dispari con hash. Io invio hash, tu invii , io rivelo , verifichi l'hash, la somma pari vince io. L'hash mi impedisce di cambiare dopo; il rischio è la forza bruta, quindi va scelto grande (per esempio 256 bit). Esempio: con valori tra 1 e 100 chi riceve l'hash trova al primo colpo.
- Famiglie. MD5 dà 128 bit, rotto per le collisioni nel 2004; si usa ancora solo per la one-way. MD2 e MD4 sono obsoleti. SHA-0 e SHA-1 sono rotti; SHA-2 (per esempio SHA-256, 256 bit = 32 byte) non è mai stato rotto ed è il più usato; SHA-3 è uno standard.
- Merkle-Damgård (MD5, SHA-1, SHA-2): 1) dati divisi in blocchi di dimensione fissa, l'ultimo completato con padding; 2) ogni blocco e l'uscita precedente entrano nella funzione di compressione, la prima iterazione parte dal vettore iniziale IV; 3) l'uscita finale è l'hash.
- Esempio padding SHA-256. Blocchi da 512 bit; il padding aggiunge un bit
1, zeri e la lunghezza su 64 bit.abc(24 bit): blocco. File di 1000 byte ( bit): blocchi. - Integrità. Cambiare un solo bit cambia completamente l'hash. Conservare l'hash (32 byte per SHA-256) al posto del file: si verifica il download confrontando con l'hash pubblicato dalla fonte.
- Esempio. SHA-256 di
ciaoinizia conb133a0c0…, diciapcon433a76b7…: differiscono in 135 bit su 256. Preimmagine circa tentativi; collisione circa (paradosso del compleanno). - Password. Si conserva l'hash (in Linux in
/etc/shadow); alla verifica si confrontano gli hash, senza mai conservare la password in chiaro.
Crittografia simmetrica
- Definizione. , con la stessa . Open design: la segretezza sta tutta nella chiave, non nell'algoritmo.
- Cesare. , (A=0, ..., Z=25). Con :
ATTACCODWWDFFR. Solo 25 chiavi, da provare tutte. - Sostituzione monoalfabetica. chiavi, ma si rompe con l'analisi delle frequenze delle lettere.
- Vigenère. Ogni lettera è spostata secondo la lettera corrispondente della chiave: con
LEMONripetuta,ATTACKATDAWNLXFOPVEFRNHR. LaAdiventaL,O,E: l'analisi delle frequenze semplice non funziona più. - Enigma. Basata sulle idee di Alberti e Vigenère; violata dai polacchi con la Bomba di Rejewski e migliorata a Bletchley Park con il contributo di Turing.
- DES. Blocchi da 64 bit, chiave da 56 (la chiave in ingresso è di 64, 8 bit servono al controllo errori). Rotto nel 1999 in 22 ore. Triple DES costoso, sostituito dall'AES.
- AES. Blocchi da 128 bit, chiavi da 128, 192 o 256 bit. Standard attuale.
| cifrario | blocco | chiave | stato |
|---|---|---|---|
| DES | 64 bit | 56 bit | rotto con la forza bruta |
| Triple DES | 64 bit | tre DES | sostituito dall'AES |
| AES | 128 bit | 128, 192, 256 bit | standard attuale |
Modi di cifratura
Due blocchi uguali in chiaro danno blocchi uguali cifrati: serve rendere diversi gli ingressi. Notazione: , , , IV.
- ECB : blocchi uguali cifrati uguali, la struttura resta visibile. Insicuro.
- CBC , con IV casuale. Blocchi uguali danno cifrati diversi; l'IV deve essere imprevedibile e unico. Sequenziale.
- CFB : cifrario a flusso, lavora su dati di qualunque lunghezza. Un errore si propaga su più blocchi.
- OFB , IV, : un errore colpisce solo il blocco corrente; il flusso di chiave si può precalcolare.
- CTR : parallelizzabile, un errore colpisce un solo blocco.
- Esempio giocattolo. , testo in chiaro , IV . ECB: (i tre blocchi uguali si vedono). CBC: , poi . CFB: , poi . OFB: . CTR: . Negli altri modi i primi tre blocchi cifrati sono tutti diversi.
Scambio della chiave
- Problema. persone che parlano a coppie in modo riservato servono chiavi: per sono .
- Diffie-Hellman. Gruppo ciclico di ordine (primo grande, per esempio 2048 bit), generatore (piccolo). A sceglie , B sceglie . A invia , B invia . Entrambi calcolano : A come , B come .
- Esempio (, ). : . : . Alice: . Bob: .
- Sicurezza. Chi ascolta conosce ma per dovrebbe ricavare da : è il logaritmo discreto, senza algoritmo polinomiale noto. Diffie-Hellman non autentica: serve firma o certificato (Crittografia asimmetrica, RSA e TLSCrittografia asimmetrica (a chiave pubblica): chiave di cifratura pubblica v_B, chiave di decifratura privata s_B, matematicamente legate; C = E_vB(P), P = D_sB(C); dà riservatezza. I certificati digitali, emessi da una Certificate Authority e firmati con la sua chiave privata, legano un'identità a una chiave pubblica. Firma digitale: hash del messaggio cifrato con la chiave privata; garantisce autenticità, integrità e non ripudio. RSA: si scelgono due primi grandi p e q, N = pq, phi(N) = (p-1)(q-1), e coprimo con phi(N), d = e^(-1) mod phi(N); chiave pubblica (N, e), segreta (N, d); cifratura c = m^e mod N, decifratura m = c^d mod N con m < N (teorema di Eulero); sicura finché la fattorizzazione è difficile (N di almeno 2048 bit); il padding casuale (PKCS#1 v1.5: 00 02 [casuale] 00 [m]) difende da malleabilità e determinismo. La firma RSA è s = m^d mod N, verificata con s^e mod N. TLS (su TCP) autentica gli estremi con il certificato, cifra i dati con una chiave di sessione simmetrica e garantisce l'integrità con i MAC; da TLS 1.0 a 1.3 la chiave si ricava con Diffie-Hellman e l'handshake si accorcia. DTLS è la versione per UDP.Crittografia asimmetrica, RSA e TLS →).
| aspetto | simmetrica | asimmetrica |
|---|---|---|
| chiavi | una sola, condivisa | coppia pubblica e privata |
| velocità | più veloce | più lenta |
| distribuzione | la chiave condivisa va distribuita in sicurezza | la pubblica si distribuisce liberamente |
| costo | basso, per grandi quantità di dati | alto, per handshake e scambi iniziali |
MAC e HMAC
- MAC (Message Authentication Code). Tag breve e di lunghezza fissa calcolato con chiave segreta condivisa e aggiunto al messaggio. Il ricevente ricalcola il tag e lo confronta: se coincide, il messaggio non è stato alterato e l'altro è l'unico possessore della chiave. Serve che senza la chiave sia impossibile produrre un tag valido.
- HMAC. , con , ripetuti volte ( byte di solito); completata con zeri fino a .
- Esempio. Con
chiave-segreta: HMAC-SHA256 dibonifico:100:IT60èbc838925…, dibonifico:900:IT60èdadd0ebe…. Senza non si ricalcola il tag giusto. Con il solo SHA-256 sarebbe stato possibile. - MAC contro firma. MAC: chiave simmetrica condivisa, integrità e autenticazione, nessun non ripudio (anche il destinatario avrebbe potuto generare il tag). Firma: chiavi asimmetriche, integrità, autenticazione e non ripudio.
- Errori tipici: credere che un hash sia una cifratura (non si inverte, non ha chiave; anche il base64 non cifra, vedi Posta elettronica - SMTP, POP3 e IMAPLa posta elettronica è una transazione a senso unico: non ha senso che il destinatario tenga un server sempre acceso, quindi si usano server intermedi. Servono due User Agent (UA, il programma dell'utente), due programmi client/server di spinta (MTA, protocollo SMTP: mittente-suo server e server-server) e un programma client/server di tiro (MAA, POP3 o IMAP4: server del destinatario-destinatario). SMTP usa TCP porta 25, comandi HELO, MAIL FROM, RCPT TO, DATA, QUIT e risposte a tre cifre (220 pronto, 250 ok, 354 inizia il testo, 221 chiusura, 421 non disponibile) in tre fasi: apertura, trasferimento, chiusura. POP3 (porta 110): utente e password, poi elenca e scarica i messaggi uno a uno; non organizza la posta sul server. IMAP4 aggiunge intestazioni prima del download, ricerca, download parziale, cartelle sul server. MIME permette di spedire dati non ASCII (immagini, video, lettere accentate) traducendoli in ASCII a 7 bit, per esempio in base64 (3 byte diventano 4 caratteri).Posta elettronica - SMTP, POP3 e IMAP →); usare ECB; riusare l'IV in CBC, OFB o CTR; credere che cifrare dia integrità (serve un MAC o una firma); dire che MD5 e SHA-1 sono sicuri; confondere la chiave di 56 bit del DES con quella di 64 in ingresso; credere che Diffie-Hellman cifri i messaggi.