Tutorials

4. Crittografia a Chiave Simmetrica

La crittografia a chiave simmetrica è un tipo di crittografia in cui la stessa chiave viene utilizzata sia per cifrare che per decifrare un messaggio. ---

La crittografia a chiave simmetrica è un tipo di crittografia in cui la stessa chiave viene utilizzata sia per cifrare che per decifrare un messaggio.


1. One-Time Pad (OTP)

L'operatore XOR (OR esclusivo) è alla base di un algoritmo di cifratura a chiave simmetrica estremamente robusto, nonché fondamento di tutti i metodi moderni. L'operatore XOR è reversibile per natura e opera bit a bit (cifrario a flusso o stream cipher).

Cifratura: $m \oplus k = c$ Decifratura: $c \oplus k = m$ Dove: $m$: plaintext (testo in chiaro) $k$: chiave $c$: ciphertext (testo cifrato)

Esempio:

Plaintext01001101
Chiave11101100
Ciphertext10100001
Ciphertext10100001
Chiave11101100
Plaintext01001101

Condizioni per la Robustezza dell'OTP:

L'uso dell'operatore XOR è robusto solo se vengono rispettate alcune condizioni cruciali: 1. Lunghezza della Chiave: La chiave deve essere lunga esattamente come il messaggio da cifrare. 2. Generazione Random: La chiave deve essere generata in modo totalmente random. Per una chiave di $n$ bit, ognuna delle $2^n$ possibilità deve avere la stessa probabilità. 3. Non Riutilizzo della Chiave (One-Time): La chiave non deve essere mai riutilizzata, nemmeno in parte. Il riuso della chiave apre la possibilità di effettuare crittoanalisi di tipo known/chosen plaintext.

Debolezza del Riuso della Chiave nell'OTP:

Supponiamo di avere due ciphertext ($c_1$, $c_2$) generati con la stessa chiave ($k$): $c_1 = m_1 \oplus k$ $c_2 = m_2 \oplus k$

Per le proprietà dello XOR ($x \oplus x = 0$ e $x \oplus 0 = x$), possiamo scrivere: $c_1 \oplus c_2 = (m_1 \oplus k) \oplus (m_2 \oplus k) = m_1 \oplus m_2 \oplus (k \oplus k) = m_1 \oplus m_2 \oplus 0 = m_1 \oplus m_2$

Questo significa che, avendo due messaggi cifrati con la stessa chiave, si può ottenere lo XOR tra i due plaintext, il che può rivelare informazioni significative o permettere la decifratura parziale o totale dei messaggi se uno dei plaintext è noto o può essere indovinato.


2. Cifrari Stream e Cifrari a Blocchi

Gli algoritmi a chiave simmetrica si dividono in due categorie principali in base a come elaborano l'input:

Cifrari Stream (a Flusso): L'input viene trattato un bit o un byte alla volta. Ogni bit/byte di input genera un bit/byte di output combinando l'input con uno stream di bit pseudorandom (keystream). L'OTP è un esempio di cifrario stream.

Cifrari a Blocchi: L'input viene diviso in blocchi di dimensione fissa. L'algoritmo tratta singolarmente ogni blocco (anche con diverse modalità operative), generando un corrispondente blocco di output. Sono i più diffusi, poiché, con opportune modalità operative, possono anche riprodurre il comportamento di un cifrario a stream.


3. Data Encryption Standard (DES) (1976)

Sviluppato da IBM nei primi anni '70 e rilasciato nel 1976. Non è più considerato sicuro a causa della chiave troppo corta. La sua struttura è stata però utilizzata da molti altri metodi moderni, rendendolo un importante caso di studio. Cifrario a blocchi: Il messaggio viene diviso in blocchi di 64 bit, e ciascuno viene cifrato singolarmente. Il processo è ripetuto 16 volte. Lunghezza Chiave: La chiave è lunga 64 bit, ma solo 56 bit sono utilizzabili (gli altri 8 sono per il parity check).

Funzionamento Breve del DES:

1. I dati vengono divisi in blocchi di 64 bit. 2. Ogni blocco è diviso a metà (32 bit ciascuna). 3. Una delle due metà è data in ingresso a una funzione di manipolazione F che, usando una sotto-chiave derivata (leggermente differente per ogni round), restituisce 32 bit. 4. Il risultato del punto 3 e la seconda metà vengono sottoposti a XOR. 5. Le due metà vengono scambiate. 6. Si ripete il processo dal punto 3 per 16 volte. $L_{i+1} = R_i$ $R_{i+1} = L_i \oplus F(R_i, K_i)$

Funzione di Cifratura F (nel DES):

La funzione $F$ è uno XOR tra un blocco informativo (32 bit) e una chiave (48 bit). Per operare, entrambi i termini devono avere la stessa lunghezza: 1. Il blocco informativo viene espanso da 32 a 48 bit (i 32 bit vengono divisi in sezioni da 4 bit, e i bit iniziali e finali di ogni gruppo vengono duplicati). 2. Il risultato del punto 1 viene sottoposto a XOR con la chiave. 3. Il risultato (48 bit) deve essere ridotto da 48 a 32 bit. I 48 bit vengono divisi in 8 sezioni da 6 bit, e ogni sezione viene ridotta a 4 bit tramite 8 S-box (Substitution Box).

S-box: Una S-box è una matrice che permette di ridurre un dato da $n$ bit a $m$ bit (con $m < n$). DES è stato sostituito da 3DES (Triple DES), che applicava DES tre volte con chiavi diverse per aumentarne la sicurezza. Tuttavia, anche il 3DES non è più molto utilizzato, sostituito dal più moderno AES.


4. Advanced Encryption Standard (AES) (2001)

AES è il metodo che ha sostituito definitivamente DES/3DES ed è, attualmente, il metodo a chiave simmetrica più utilizzato. È stato scelto nel 2001 dopo un concorso durato 5 anni. È anche noto come cifrario Rijndael, dal nome dei suoi ideatori. Cifrario a blocchi: I blocchi e la chiave partono da un minimo di 128 bit e possono essere incrementati a blocchi di 32 bit. I formati più comuni oggi utilizzano chiavi da 128, 192 e 256 bit (denominati rispettivamente AES-128, AES-192, AES-256). La possibilità di aumentare la lunghezza della chiave permette di "aggiornare" nel tempo la robustezza del metodo, risolvendo un problema dei metodi precedenti come DES.

Funzionamento dell'AES:

AES elabora blocchi di 128 bit (16 byte) organizzandoli in matrici di $4 \times 4$ byte. I bit di input subiscono un numero di round di elaborazione variabile in base alla lunghezza della chiave: 10 round per chiavi da 128 bit 12 round per chiavi da 192 bit 14 round per chiavi da 256 bit Tutti i round utilizzano una chiave di 16 byte (derivata dalla chiave di cifratura) e prevedono 4 tipi di trasformazioni, ad eccezione dell'ultimo round che ne prevede solo 3.

Fasi di Ogni Round AES:

Ogni round è composto da 4 fasi, tutte reversibili per consentire la decifratura: 1. Substitute Bytes: Una S-box opera byte per byte per eseguire una sostituzione non lineare. 2. Shift Rows: Esegue una permutazione ciclica delle righe della matrice di stato. 3. Mix Columns: Esegue operazioni lineari complesse tra gli elementi delle singole colonne. 4. Add Round Key: Effettua lo XOR tra la matrice di stato e la chiave specifica per il round in corso.

Sicurezza di AES:

AES è ad oggi considerato estremamente sicuro. Non ci sono dati certi su attacchi a forza bruta riusciti contro AES. È stato scelto dal Dipartimento di Sicurezza Americano (NSA) per la codifica delle informazioni secret e top secret: Chiavi da 128 bit per le informazioni secret. Chiavi da 192 o 256 bit per le informazioni top secret.


5. Modalità Operative di AES

Quando la dimensione del plaintext supera la dimensione del blocco (128 bit per AES), possono sorgere problemi di sicurezza. Il NIST (National Institute of Standards and Technology) definisce cinque possibili modalità operative per affrontare queste problematiche, ciascuna con caratteristiche e ambiti di applicazione specifici. AES implementa tutte e cinque le modalità:

1. ECB (Electronic Codebook) 2. CBC (Cipher Block Chaining) 3. CFB (Cipher Feedback) 4. OFB (Output Feedback) 5. CTR (Counter Mode)


a. ECB (Electronic Codebook)

Prevede di cifrare singolarmente ogni blocco di messaggio. Vantaggi: Estremamente semplice da implementare e rapido da eseguire, potendo sfruttare architetture parallele. Svantaggi: Genera messaggi cifrati che possono essere decifrati tramite analisi di frequenza (pattern ripetuti nel plaintext producono pattern ripetuti nel ciphertext). È possibile tentare di modificare il messaggio in chiaro tramite la modifica del messaggio cifrato (es. riordinare i blocchi). Formula: $C_i = E(K, P_i)$ $P_i = D(K, C_i)$ Uso Consigliato: Per la cifratura di valori di dimensione minore o uguale a quella del blocco. È la modalità operativa più semplice e performante, ma anche la meno sicura.


b. CBC (Cipher Block Chaining)

Cifra ogni blocco considerando anche il blocco cifrato precedente. In ogni stadio, l'input della funzione di cifratura è dato dallo XOR del plaintext con il ciphertext dello stadio precedente. Tutti gli stadi utilizzano la stessa chiave di cifratura. Per la cifratura del primo blocco, si introduce un ciphertext fittizio chiamato Vettore di Inizializzazione (IV), generato in modo random e trasferito insieme al messaggio. Formula: $C_i = E(K, C_{i-1} \oplus P_i)$, dove $C_0 = IV$ $P_i = C_{i-1} \oplus D(K, C_i)$, dove $C_0 = IV$

Vantaggi rispetto a ECB: I blocchi di ciphertext non hanno una corrispondenza 1:1 con i blocchi di plaintext. I blocchi non possono essere sostituiti o invertiti arbitrariamente. La randomicità del ciphertext è maggiore. Svantaggi rispetto a ECB: La cifratura non può avvenire in parallelo (la decifratura sì). Uso Consigliato: Modalità consigliata per cifrature "general purpose" e per trasmissioni block-oriented.

#### Il Vettore di Inizializzazione (IV) in CBC:

Il Vettore di Inizializzazione (IV) è cruciale e deve soddisfare i seguenti requisiti: Deve essere randomico. Deve essere differente per ogni messaggio cifrato. Deve essere noto sia al mittente che al destinatario, ma non deve essere predicibile da una terza parte prima della sua generazione. Deve essere protetto da modifiche (integrità, non riservatezza). Questo può essere fatto cifrandolo usando ECB o tramite un MAC.

Generazione dell'IV (NIST SP800-38A): 1. Generare l'IV cifrando, con lo stesso algoritmo e la stessa chiave, un nonce. Il nonce deve avere le dimensioni di un blocco ed essere univoco per ogni operazione di cifratura (es. un contatore o un timestamp). 2. Generare un IV random utilizzando un generatore di numeri casuali approvato (FIPS approved).

Importanza dell'Integrità dell'IV: La possibilità di modificare l'IV può permettere a un attaccante di modificare alcuni bit del primo blocco del plaintext: $P_1 = IV \oplus D(K, C_1)$ Per le proprietà dello XOR, la modifica di un bit dell'IV comporta la modifica del bit corrispondente nel plaintext.


c. CFB (Cipher Feedback Mode), OFB (Output Feedback Mode), CTR (Counter Mode)

Queste tre modalità operative sono utilizzate per trasformare un cifrario a blocchi in un cifrario a stream: Eliminano la necessità di padding del plaintext a un numero intero di blocchi. Il ciphertext non viene generato a blocchi, ma a unità di trasmissione (es. 1 byte). La codifica/decodifica può avvenire in real-time per ogni unità di trasmissione. La lunghezza totale del ciphertext è uguale alla lunghezza totale del plaintext, evitando sprechi di banda.

#### i. CFB (Cipher Feedback Mode)

Considerando un'unità di trasmissione di $s$ bit, CFB usa una struttura analoga a CBC, impiegando shift register per ricostruire il blocco di 128 bit da cifrare. In decifratura, CFB continua ad usare l'algoritmo di encryption, sfruttando la proprietà dello XOR ($A \oplus B \oplus B = A$). Propagazione degli errori: In CFB, come in tutti i cifrari a stream, l'inversione di un bit del ciphertext porta all'inversione dello stesso bit del plaintext. Un errore in un bit del ciphertext si propaga a tutti gli stadi successivi. Uso Consigliato: Da preferirsi per trasmissioni stream-oriented general purpose.

#### ii. OFB (Output Feedback Mode)

Riprende la struttura di CFB con alcune differenze: L'unità di trasmissione è fissa e pari alla dimensione del blocco. Il ciphertext non viene propagato verso gli stadi successivi. Utilizza un'impostazione analoga a quella dei cifrari stream nativi. IV in OFB: Non è necessario che l'IV sia non predicibile a priori. È però necessario che sia univoco e mai riutilizzato. Può essere generato tramite un nonce (contatore, timestamp). In caso di riuso dell'IV, è possibile, tramite un attacco known plaintext, risalire agli output delle funzioni di encrypt e riutilizzarli per decifrare messaggi successivi. Propagazione degli errori: Anche in OFB l'inversione di un bit del ciphertext porta all'inversione dello stesso bit del plaintext, ma l'errore rimane limitato e non si propaga verso gli stadi a valle. Uso Consigliato: Per trasmissioni stream-oriented su canali molto rumorosi.

#### iii. CTR (Counter Mode)

Riprende la struttura di OFB con una differenza chiave: Non viene utilizzato un singolo IV applicato al primo stadio e propagato, ma tanti IV, uno per ogni stadio, senza necessità di propagazione. Possono essere utilizzati dei contatori, scelti in maniera casuale per il primo stadio e incrementati di 1 per ogni stadio successivo.

Vantaggi rispetto a CFB e OFB: Parallelismo: Cifratura e decifratura possono fare uso di architetture parallele in quanto non c'è concatenazione (e quindi sincronizzazione) tra gli stadi. Ogni stadio può essere elaborato indipendentemente dagli altri. Efficienza di esecuzione: Gli output delle funzioni di encrypt possono essere pre-processati e memorizzati. Sicurezza: CTR è sicuro quanto CFB e OFB. Uso Consigliato: Per trasmissioni stream-oriented general purpose, specialmente quando le performance sono importanti.