Differenza tra cifrari a flusso (Stream Ciphers) e cifrari a blocchi (Block Ciphers)

Un cifrario è un insieme di regole matematiche (algoritmo) per convertire testo leggibile (plaintext) in testo illeggibile (ciphertext). La differenza principale tra cifrari a flusso e a blocchi è che i primi operano su flussi di testo, un bit o un byte alla volta, mentre i secondi operano su blocchi di testo.
Cifrario a flusso (Stream Cipher)
L'idea base è dividere il testo in piccoli blocchi (1 bit o 1 byte) e codificare ciascun blocco in base a molti blocchi precedenti. I cifrari a flusso usano una chiave di cifratura diversa per ogni bit/byte, così lo stesso bit produce ciphertext diverso ogni volta. Alcuni usano un generatore di keystream, che produce un flusso di bit casuale (o quasi). Il cifrario esegue un'operazione booleana (XOR esclusivo) tra i bit del keystream e quelli del plaintext per produrre il ciphertext.
Cifrario a blocchi (Block Cipher)
L'idea base è dividere il testo in blocchi relativamente grandi (tipicamente 64 o 128 bit) e codificare ciascun blocco separatamente. La stessa chiave di cifratura viene usata per ogni blocco ed è la chiave a determinare l'ordine in cui sostituzioni, permutazioni e altre funzioni matematiche vengono applicate a ogni blocco. Algoritmi robusti rendono virtualmente impossibile l'ingegneria inversa del cifrario.
Diffusione e confusione
I cifrari a blocchi usano tecniche note come confusione e diffusione. La confusione mira a rendere il più complesso possibile il rapporto tra chiave e ciphertext: idealmente ogni carattere della chiave influenza ogni carattere del ciphertext. La diffusione spande l'influenza di ogni carattere del plaintext su più caratteri del ciphertext, rendendo il cifrario meno suscettibile ad attacchi statistici.
Pro e contro
Il fatto che i cifrari a flusso cifrino/decifrino un bit alla volta li rende adatti ad applicazioni hardware in tempo reale (audio, video). Sono più deboli e meno efficienti dei cifrari a blocchi per applicazioni software, dove sono meno usati. I cifrari a blocchi sono più facili da implementare in software perché cifrano dati in blocchi di lunghezza già usata dal software; la chiave ha spesso la stessa lunghezza del blocco.