# Rete di Feistel

In crittologia, un cifrario di Feistel è un algoritmo di cifratura a blocchi con una particolare struttura sviluppata dal crittologo dell'IBM Horst Feistel, da cui ha preso il nome di rete di Feistel; moltissimi algoritmi di cifratura a blocchi la utilizzano, incluso il Data Encryption Standard (DES). La struttura inventata da Feistel ha il vantaggio che la cifratura e decifratura sono operazioni molto simili, spesso identiche, e che basta invertire il funzionamento del gestore della chiave per ottenere l'operazione inversa: quindi i circuiti di cifratura e decifratura spesso sono gli stessi. Il meccanismo di cifratura ricorda le operazioni in cascata di Enigma.
Molti algoritmi moderni sono basati sulle reti di Feistel e la struttura proposta da Feistel è stata analizzata a fondo dai crittologi, anche se i più sicuri escono dal paradigma dell'invertibilità e sfruttano o la crittografia asimmetrica o tecnologie innovative come il DARPA Quantum Network.
Il cifrario di Feistel è anche usato in altri tipi di algoritmi crittografici, non solo nei cifrari a blocchi. Ad esempio, l'Optimal Asymmetric Encryption Padding utilizza una semplice rete di Feistel per rendere casuali i testi cifrati in alcuni schemi di cifratura a chiave asimmetrica.

## Storia

La rete di Feistel venne commercializzata per la prima volta da IBM con il nome di Lucifer, un algoritmo progettato da Feistel e Don Coppersmith. La rete di Feistel divenne molto popolare quando il Governo degli Stati Uniti adottò come standard crittografico il DES (un algoritmo basato sul Lucifer con alcune modifiche apportate dalla NSA). Come altre parti del DES la rete di Feistel, essendo una struttura che presupponeva molte iterazioni dello stesso blocco, era semplice da realizzare con i circuiti producibili a quel tempo.

## Struttura generale

La rete di Feistel è simile come concezione al cifrario del prodotto e utilizza le seguenti operazioni:
* Bit-shuffling (chiamata anche permutazione o P-box)
* Semplice funzione non lineare (chiamata anche S-box)
* Unione lineare (nel senso dell'algebra modulare) utilizzando lo XOR
Queste operazioni, reiterate più volte (round), conferiscono alla rete di Feistel le proprietà di "confusione e diffusione" descritte da Claude Shannon.

## Dettagli costruttivi

Poniamo $F$ essere la funzione dei passaggi e $K_{0},K_{1},\ldots ,K_{n}$ le sotto-chiavi rispettivamente dei passaggi $0,1,\ldots ,n.$ Le operazioni basilari sono dunque le seguenti:
Dividere i dati di ingresso in due parti uguali $(L_{0},R_{0}).$
Per ogni round $i=1,2,\dots ,n,$ calcolare
    $L_{i}=R_{i-1},$
    $R_{i}=L_{i-1}\oplus f(R_{i-1},K_{i-1}),$
dove $f$ è la funzione del round e $K_{i}$ è la chiave di sessione.
Si ottiene quindi il testo cifrato $(L_{n},R_{n}).$
Senza considerare la funzione $f,$ la decifrazione si ottiene con
    $R_{i-1}=L_{i},$
    $L_{i-1}=R_{i}\oplus f(L_{i},K_{i}).$
Un vantaggio di questo modello è che le funzioni $f$ usate sono unidirezionali e possono essere molto complesse.
Questo diagramma mostra la cifratura e la decifratura del messaggio. Notare l'inversione della chiave di sessione per la decifratura, è l'unica differenza rispetto alla cifratura del messaggio.

## Cifrario di Feistel non bilanciato

Un cifrario di Feistel non bilanciato utilizza una versione modificata della struttura con $L_{0}$ e $R_{0}$ di lunghezze diverse. Lo Skipjack è un esempio di questa tipologia di algoritmi. La Texas Instruments utilizza un cifrario di Feistel non bilanciato proprietario nel suo Digital Signature Transponder, un dispositivo wireless per l'autenticazione.

## Lista di cifrari di Feistel

Feistel o Feistel modificati: Blowfish, Camellia, CAST-128, Data Encryption Standard (DES), FEAL, KASUMI, LOKI97, Lucifer, MAGENTA, MISTY1, RC5, Tiny Encryption Algorithm (TEA), Triple DES, Twofish, XTEA.
Feistel generalizzato: CAST-256, MacGuffin, RC2, RC6, Skipjack.