Un cifrario a blocchi ideale consiste del numero massimo di mappature crittografiche utilizzabili a partire da un blocco di testo in chiaro.
Per esempio avendo un un blocco di plaintext di
Se il blocco è troppo corto la critto-analisi diventa facile: servono dei blocchi abbastanza grandi per rendere difficile la critto-analisi.
Avendo un blocco di
Si richiedeva necessario un cifrario che utilizzando un chiave di
In particolare Feistel propose un cifrario che alternasse sostituzioni e permutazioni.
Con la prima ogni elemento (o gruppo di elementi) del plaintext è sostituito, unicamente, con un elemento (o gruppo di elementi) del ciphertext.
Con la seconda si scambiano gli elementi del blocco ottenendone una permutazione.
Con questo cifrario si ottengono:
L'input di un cifrario di Feistel è un plaintext di lunghezza
Il blocco in plaintext viene diviso in due metà:
Ogni round ha la stessa struttura:
La funzione F (round function) prende come input
Vengono poi scambiate le due metà del blocco in ogni round.
Il processo di decifratura è l'inverso del processo di cifratura.
Per ogni round viene prodotta una sotto chiave
La chiave viene divisa in due parti:
A
Il risultato diventa la chiave per il round successivo.
Lo stesso risultato viene passato ad una funzione di permutazione/contrazione che riduce la chiave da 56 bit a 48.
Nota: la chiave passata all'inizio è di 64 bit, ma solo 56 sono utili a DES, gli altri bit sono utilizzati come bit di controllo.
Ad eccezione del primo e dell'ultimo step (IP e IP inversa), DES è una implementazione del cifrario di Feistel.
Una proprietà interessante di un algoritmo di cifratura è che un piccolo cambiamento nella chiave o nel plaintext, produce un importante cambiamento del ciphertext. Questo risultato è noto come effetto valanga.
Dividiamo il blocco di 64 bit in due parti da 32. Abbiamo
Nel singolo passo avviene una espansione di
Tali 48 bit vengono messi in XOR con la chiave passata (di 48 bit).
Dopo di ché il risultato dello XOR viene passato ad una funzione che produce un output a 32 bit.
Il plaintext a 64 bit viene inizialmente permutato.
Seguono 16 round della stessa funzione, che coinvolge sia una funzione di permutazione, che una di sostituzione (usando la chiave).
Nel blocco risultante vengono scambiate le due parti (sinistra e destra) ottenendo il pre-output.
Viene applicata la funzione inversa
Anche la chiave viene passata ad una funzione di permutazione.
x | x | x | x |
---|---|---|---|
x | x | x | x |
x | x | x | x |
x | x | x | x |
x | x | x | x | ... |
---|---|---|---|---|
x | x | x | x | ... |
x | x | x | x | ... |
x | x | x | x | ... |
Di seguito supporremo di avere una chiave di
Questo può essere considerato come il round 0.
Alla matrice 4 x 4 passata in input, viene applicata una trasformazione iniziale dalla quale si ottiene una matrice 4 x 4.
La matrice in alto nella figura è quella ottenuta dalla chiave passata in input (16 byte).
Ogni colonna della matrice, rappresenta una word di 32 bit.
Le prime quattro word, non sono altro che le colonne della chiave disposte in un array di word da 32 bit.
Per generare le word successive viene utilizzata una funzione
Per generare
AES non è un cifrario di Feistel, metà del blocco viene utilizzato per modificare l'altra metà e poi le metà vengono scambiate. AES processa il blocco per intero.
La struttura è semplice sia per la cifratura che per la decifratura. (DES è complicato).
La AddRoundKey è l'unica ad utilizzare la chiave ed è una forma del cifrario di Vernam, la cui sicurezza non è il massimo. Tuttavia essa contribuisce al lavoro di confusione, diffusione e non linearità che le altre 3 trasformazioni forniscono, ma che sarebbero inutili senza la AddRoundKey che è l'unica ad usare la chiave.
Ogni passo è reversibile.
Come per la maggior parte dei cifrari a blocchi l'algoritmo di decifratura fa uso della chiave espansa in ordine inverso. In ogni caso il processo di decifratura non è identico a quello di cifratura. Il che è una conseguenza della particolare struttura di AES.
Il numero di round dipende dalla lunghezza della chiave.
I primi
L'ultimo round (
La trasformazione inziale che viene applicata prima del round
Il blocco di 128 bit è disposto in una matrice 4 x 4.
Con la ShiftRows ogni riga viene shiftata di 1 a sinistra per un certo numero di volte, che dipende dalla posizione in cui si trova la riga. Le operazioni sono effettuate in
In questa fase, ogni colonna del blocco viene trattata come un vettore di 4 byte, ciascuna colonna viene moltiplicata per una matrice fissa di trasformazione, la moltiplicazione è effettuata in
La chiave fornita è espansa in un array di 44 word di 32 bit.
Ad ogni round vengono passate 4 di queste word (
Al round 0 viene passata
Al round 1 viene passata
E così via.
Le chiavi sono passate sotto forma di matrici.