# Keystream

In crittografia con il termine keystream si indica un flusso di caratteri pseudo-casuali che sono combinati con il messaggio in chiaro per produrre il messaggio cifrato. I "caratteri" nel keystream possono essere bit, byte, numeri o caratteri alfanumerici, a seconda dei casi.
I keystream sono alla base dei cifrari a flusso (stream cipher) ma sono di solito utilizzati anche nei cifrari one-time pad. I cifrari a blocchi possono essere impiegati per produrre dei keystream utilizzandoli in modalità CTR: in questa modalità il cifrario a blocchi si trasforma in un vero e proprio cifrario a flusso.
La cifratura/decifratura avviene sommando, sottraendo o combinando con un'operazione di XOR ogni carattere del testo in chiaro ad un carattere del keystream per generare un carattere cifrato. Nelle implementazioni informatiche gli algoritmi di cifratura operano a livello di bit per cui in genere il keystream viene combinato con il testo in chiaro utilizzando lo XOR dato che questa operazione logica ha la prerogativa di essere reversibile: questo significa che combinando un bit del testo in chiaro con un determinato bit di keystream si ottiene un bit cifrato che ricombinato tramite XOR con lo stesso bit di keystream restituisce il bit in chiaro iniziale.

## Generatore del keystream

Il keystream, o flusso chiave, è generato da un apposito algoritmo del cifrario, che serve a creare il flusso di caratteri pseudo-casuali che saranno utilizzati per la cifratura, normalmente inizializzato utilizzando la chiave di cifratura fornita dall'utente; in genere viene anche utilizzato un nonce, un valore numerico introdotto nel keystream in modo da variare il flusso di dati. Infatti, un noto problema di questo modo di operare è che un generatore di keystream produrrà flussi di dati identici con chiavi identiche: ecco perché è consigliabile sempre, con i cifrari a flusso, cambiare la chiave segreta ad ogni operazione di cifratura oppure introdurre un nonce per variare il keystream.

## Sicurezza del keystream

Per la sicurezza stessa del cifrario, è necessario che il keystream risponda a tre requisiti fondamentali:
* deve apparire il più casuale possibile;
* deve avere un periodo lungo almeno quanto il testo da cifrare;
* non deve avere sequenze di caratteri che si ripetono periodicamente.
È ovvio che non è possibile utilizzare un keystream completamente casuale dato che il keystream deve essere identico sia per l'operazione di cifratura che per quella di decifratura: se si avesse un keystream veramente casuale, non si potrebbe riottenere il testo in chiaro originale dato che anche usando la stessa chiave segreta il generatore di keystream produrrebbe un flusso totalmente differente da quello creato per la cifratura. Ecco perché il flusso deve apparire il più casuale possibile agli occhi di un crittoanalista ma essere ripetibile: si parla in questo caso di pseudo-casualità.
Relativamente alla lunghezza del periodo, è importante che il generatore non ripeta la stessa sequenza già generata prima che sia stato cifrato tutto il testo in chiaro, altrimenti diverse porzioni di quest'ultimo sarebbero cifrate con lo stesso flusso di dati offrendo ad un crittoanalista utili informazioni per la decrittazione del testo cifrato.
Ma se anche la lunghezza del periodo è di importanza vitale, non è però l'unico elemento che ne determina la sicurezza: è anche importante che non presenti sequenze periodiche o troppi bit di valore zero o uno. Se infatti un generatore produce bit zero per la quasi totalità del keystream il testo in chiaro sarà in questo caso quasi identico al testo cifrato. Ma anche la ripetitività è un fattore che diminuisce la sicurezza del keystream: un crittoanalista può infatti selezionare una sequenza di bit e predire i dati che saranno generati in seguito.