Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
- Un cifrario deve poter essere rotto in tempi non realistici e con risorse non
accessibili (es. uno schema si può rompere in 20.000 anni). Non bisogna
creare un cifrario indecifrabile.
Fin dai tempi di Cesare, anche se non si conosceva la somma modulare (lo XOR),
questa era già usata in maniera inconsapevole.
Il problema di Vigenère è che nel momento in cui hai una chiave segreta, devi
metterla in parallelo con il testo in chiaro e fare una somma modulare lettera per
lettera. La chiave va ripetuta quando termina. Il ripetere più volte la stessa parola
segreta crea una vulnerabilità perché basta sottocampionare il testo cifrato.
Nel one-time-pad, la chiave deve essere completamente random e lunga tanto
quanto il messaggio in chiaro. Questo schema è completamente sicuro, perché non
esiste una soluzione. La chiave è random, i bit hanno la stessa probabilità di essere
giusti o sbagliati. Questo schema però non è utilizzabile nel mondo reale per il fatto
della lunghezza della chiave. Non è un sistema pratico per il mondo moderno (es.
per comprare articoli online). Questo schema, nonostante sia perfetto per la
confidenzialità, è completamente vulnerabile per l’integrità: manipolare del testo
cifrato con questo sistema, non permette di capire quali parti siano cifrate e quali
no. Essendo la cifratura basata sullo XOR, ed essendo lo XOR commutativo, se un
attaccante modifica alcuni bit (da 0 a 1 o viceversa), il destinatario non si accorgerà
della modifica. Si parla quindi di malleabilità dello schema (capire quali porzioni di
testo sto criptando e quali no).
COMPUTATIONAL SECURITY
Quello che cerchiamo di avere è avere uno schema di cifratura che offre due
funzioni efficienti e una inefficiente.
- Le due funzioni efficienti sono di cifratura e di decifratura. Chi cifra e chi
decifra i dati con conoscenza della chiave esegue quell’operazione con poche
risorse. La funzione efficiente è un algoritmo con un costo polinomiale: il
numero di operazioni per decifrare o cifrare è esprimibile con un polinomio
IL NONCE
Il nonce è una sequenza di bit potenzialmente non random (es. un contatore) e
viene utilizzato 1 volta sola. In caso di più utilizzi dello stesso nonce si incorre in una
vulnerabilità enorme.
Chi spedisce i dati genera il nonce, cifra il messaggio e invia il testo insieme al nonce.
L’attaccante può leggere il nonce in chiaro, ma non serve a nulla perché da solo non
dà informazioni.
Dati una stessa chiave e uno stesso nonce, uno stream cipher produce la stessa
stream key. Questo distrugge completamente il cifrario, cripto dati diversi con la
stessa chiave. La natura del calcolo di questi schemi permette all’attaccante di
ottenere informazioni nel caso il nonce sia lo stesso.
BLOCK CIPHERS
Lavorando con i block cipher si ha a che fare con AES, lo standard universale. AES
non è uno schema di cifratura, né un block cipher, è una famiglia di cifrari che
identifica 3 particolari istanze: può esistere come 128, 192 e 256. Questi numeri si
riferiscono alla lunghezza in bit della chiave. Bisogna specificare anche la modalità di
cifratura con cui usare il cifrario a blocchi.
È un oggetto matematico definito come una famiglia di permutazioni pseudo-
random che dipendono da una chiave.
Un block cipher altro non è che un cifrario a sostituzione (assumendo un certo
alfabeto, sostituisco una lettera con un’altra lettera dello stesso alfabeto).
Un block cipher ideale (tabella) è troppo grosso per essere utilizzato e memorizzato
in una macchina. Vogliamo costruire un oggetto che si comporta come un cifrario a
sostituzione ideale ma non vogliamo memorizzare tutte le combinazioni. Ci serve
però una chiave. La chiave del block cipher concettualmente agisce come indice: va
a dire “utilizza la sostituzione numero x”.
Qual è il valore di n? Il numero di bit che sostituiamo ogni volta per fare in modo che
lo schema sia resistente/non vulnerabile ad attacchi di frequenza? Dipende: ad
esempio AES ha una block size di 128 bit. A prescindere dalla dimensione della
chiave, la block size resta quella, vengono sostituiti 128 bit alla volta. Ma che
succede se cifro dei dati più corti di 128 bit?
Il predecessore di AES è DES. Aveva una block size di 64 bit, rischioso per l’epoca
moderna. Aumentare la dimensione del blocco è un modo per rafforzare lo schema
dal punto di vista degli attacchi di frequenza.
Il block cipher non sostituisce direttamente i dati: utilizziamo delle modalità
apposite, aggiungendo operazioni. Ad esempio, utilizzando il CBC, creiamo un
effetto cascata tra tutti i blocchi cifrati: viene fatto lo XOR tra il blocco cifrato e il
testo in chiaro (Cipher Block Chaining). In questo caso entra in gioco l’initialization
vector: è un oggetto simile al nonce, e garantisce la sicurezza di tanti messaggi da
cifrare. La concatenazione rompe i pattern all’interno di uno stesso messaggio, ma
cifrando più testi uguali si ottiene lo stesso ciphertext. IV è un input che deve essere
fornito dall’utente, come il nonce, e deve essere random e diverso ogni volta.
IV e nonce sono due cose diverse:
- Il nonce serve nei casi in cui l’unicità è critica
- IV serve nei casi in cui la randomicità è critica: se l’attaccante riesce a predire
gli initialization vector che utilizzeremo può effettuare attacchi gravi, per
questo il fattore random è importante
Il counter pone un limite alla quantità di dati cifrabile con una singola invocazione
della funzione, mentre il nonce pone un limite al numero di invocazioni della
funzione.
In caso la lunghezza del testo in chiaro non fosse multipla della lunghezza della
stream key, prendo solo una parte della stream key, il resto lo scarto. Alla fine io ho
bisogno di fare uno xor tra testo e chiave, quindi non importa se uso tutta la chiave
o solo una parte. Questo però non vale in modalità CBC (quella con l’initialization
vector). I block cipher non lavorano con lunghezze variabili, hanno bisogno di
lunghezze definite, e se in input ho il plaintext non posso avere una lunghezza che
non sia un multiplo della dimensione del blocco (es. tutti i blocchi devono essere di
128 bit).
Se voglio criptare dei messaggi utilizzando delle tecniche che prevedono una
dimensione multipla della block size entra in gioco il padding, cioè l’inserimento di
dati fittizi che aggiustano la dimensione. Ovviamente questi dati devono essere
distinguibili dai dati reali. Storicamente venivano aggiunte frasi e parole a caso che
non c’entravano niente con il testo. In epoca moderna c’è uno standard, PKCS7.
Lo standard prevede di aggiungere N volte il numero N di byte mancanti (es: se
mancano 6 byte, aggiungi 6 volte il numero 6). In caso i dati siano già della
dimensione corretta, si aggiunge block-size volte il valore della block size (es: nel
caso in cui avessi a disposizione 16 byte e li avessi già occupati tutti, bisogna
aggiungere 16 volte il numero 16).