Cifrario a blocchi ideale
...

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 bit, un cifrario a blocchi ideale utilizza mappature.

Problema 1
...

Se il blocco è troppo corto la critto-analisi diventa facile: servono dei blocchi abbastanza grandi per rendere difficile la critto-analisi.

Problema 2
...

Avendo un blocco di bit e dunque mappature servirà una chiave lunga: . Per esempio con blocchi di bit sarebbe necessaria una chiave di bit. Troppo grande per i nostri computer.

Cifrario di Feistel
...

Si richiedeva necessario un cifrario che utilizzando un chiave di bit per blocchi di lunghezza . Approssimando la sicurezza di tale cifrario a quello ideale, sfruttando un cifrario del prodotto, ovvero usando più cifrari semplici in sequenza.
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.

Confusione e diffusione
...

Con questo cifrario si ottengono:

  • diffusione: la struttura statistica del plaintext viene distribuita in modo uniforme in tutto il ciphertext, complicando l'analisi statistica;
  • confusione: ottenuta attraverso la permutazione.

Struttura cifrario di Feistel
...

L'input di un cifrario di Feistel è un plaintext di lunghezza bit e un chiave .
Il blocco in plaintext viene diviso in due metà:


  • Le due metà attraversano un certo numero di round arbitrario, più sono e meglio è.
    Il round -esimo ha come input le metà e del round (precedente). Allo stesso modo ad ogni round viene utilizzata una sotto-chiave di quella passata all'inizio. Le sotto-chiavi sono diverse per ogni round .

Ogni round ha la stessa struttura:
Pasted image 20230418160701.png
La funzione F (round function) prende come input e , il risultato di questa viene messo in XOR con .
Vengono poi scambiate le due metà del blocco in ogni round.

Il processo di decifratura è l'inverso del processo di cifratura.

Permutazione e shift
...

Per ogni round viene prodotta una sotto chiave applicando a uno shift circolare a sinistra e una permutazione.

In dettaglio
...

La chiave viene divisa in due parti: e , dove è la parte di sinistra e quella di destra.
A viene applicato lo shift circolare a sinsitra.
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.

In sostanza
...

Ad eccezione del primo e dell'ultimo step (IP e IP inversa), DES è una implementazione del cifrario di Feistel.

Effetto valanga
...

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.

Singolo passo in dettaglio
...

Dividiamo il blocco di 64 bit in due parti da 32. Abbiamo (blocco a 32 bit di sinistra) e (quella di destra).
Nel singolo passo avviene una espansione di (16 bit di vengono duplicati) ottenendo di 48 bit.
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.

Permutazione Iniziale (IP)
...

Il plaintext a 64 bit viene inizialmente permutato.

Round
...

Seguono 16 round della stessa funzione, che coinvolge sia una funzione di permutazione, che una di sostituzione (usando la chiave).

Le due metà vengono scambiate
...

Nel blocco risultante vengono scambiate le due parti (sinistra e destra) ottenendo il pre-output.

Applicazione di
...

Viene applicata la funzione inversa al pre-output.

DES
...

Permutazione
...

Anche la chiave viene passata ad una funzione di permutazione.

AES
...

Blocco disposto in una matrice 4 x 4 di byte
...

xxxx
xxxx
xxxx
xxxx

Chiave disposta in matrice di M byte
...

xxxx...
xxxx...
xxxx...
xxxx...

Di seguito supporremo di avere una chiave di byte.

Trasformazione iniziale: AddRoundKey
...

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.

Generazione delle chiave
...

Pasted image 20231120183105.png
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 (che in realtà ne comprende altre due).
Per generare , viene fatta passare in e il suo risultato viene messo in XOR con . Il risultato viene messo in XOR con per generare e così via.

Osservazioni
...

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.

Per i round : avviene applicazione di 4 trasformazioni
...

Il numero di round dipende dalla lunghezza della chiave.
I primi round eseguono quattro trasformazioni distinte:

  • SubBytes: usa una S-box per effettuare sostituzioni byte-per-byte del blocco attraverso inversi in ;
  • ShiftRows: una semplice permutazione;
  • MixColumns: una sostituzione che fa uso dell'aritmetica in ;
  • AddRoundKey: XOR bit a bit del blocco corrente con una porzione della chiave espansa (del round corrente). Solo questa trasformazione fa uso della chiave.

L'ultimo round () contiene solo tre di queste trasformazioni, non viene effettuata la MixColumns.
La trasformazione inziale che viene applicata prima del round , è una AddRoundKey.

ShiftRows
...

Il blocco di 128 bit è disposto in una matrice 4 x 4.
Pasted image 20230719094306.png
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 .

MixColumns
...

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

Espansione di chiave
...

La chiave fornita è espansa in un array di 44 word di 32 bit.
Ad ogni round vengono passate 4 di queste word (bit).
Al round 0 viene passata .
Al round 1 viene passata .
E così via.
Le chiavi sono passate sotto forma di matrici.

Soluzione
plaintext a 64 bit
chiave a 64 bit
K i-esima (48 bit)
Plaintext di 16 byte (128 bit) in uno State Array
Chiave di M byte (16, 24, 32)
w[0,3]
w[4,7] ... w[40,43]