AES è una cifra di blocco : prende come input un blocco (16 byte, nel caso di AES) e un tasto (16, 24 o 32 byte, per AES) e emette un altro blocco (di nuovo 16 byte). È un algoritmo completamente deterministico, completamente specificato, e tutti nel mondo dovrebbero ottenere lo stesso blocco di output per lo stesso blocco e chiave di input.
Tuttavia, non si cripta un blocco, si cripta un messaggio . Il codice a blocchi è solo un elemento di costruzione; la crittografia effettiva utilizza una modalità di funzionamento che richiama ripetutamente il codice di blocco. Ci sono buone modalità e ci sono cattive modalità; l'obiettivo è quello di ottenere la riservatezza del messaggio nel suo complesso e di non perdere informazioni parziali, ad esempio se due parti del messaggio sono uguali tra loro. In particolare, se vogliamo crittografare due messaggi con la stessa chiave, di solito non vogliamo rivelare se i due messaggi erano identici o meno, quindi qualcosa deve cambiare, da qualche parte, tra le due crittografie .
La maggior parte delle modalità operative utilizza un vettore di inizializzazione che è il punto in cui viene iniettato il non-determinismo. Alcune modalità (ad es. GCM o EAX ) richiede solo un IV non ripetuto; un contatore può andare bene per loro e può essere implicito in qualche contesto (ad esempio quando ci sono messaggi successivi su un determinato flusso di comunicazione, il numero del messaggio può servire come IV). Alcune altre modalità, in particolare CBC, sono sicure in tutta la generalità solo se l'IV viene scelto in modo casuale, uniforme, con un strong PRNG e il prossimo IV da usare non è già noto quando vengono scelti i dati in testo normale. l'incapacità di soddisfare tutti questi requisiti è stata la fonte di molti problemi, ad es. l'attacco BEAST su SSL .
Quindi si potrebbe dire che la crittografia simmetrica sicura richiede almeno memoria (ad esempio, per ricordare un valore del contatore) o casualità . La "memoria" può essere un contatore comune in tutto il mondo (ad esempio l'ora corrente, ma fai attenzione alle regolazioni dell'orologio!).
Se sei pronto a tollerare la piccola perdita sul fatto che due determinati messaggi di input siano identici o meno, allora è possibile avere un parametro completamente deterministico, senza memoria sistema di crittografia, ma non sarà compatibile con la crittografia in streaming (è necessario mantenere l'intero messaggio in memoria durante il processo). Fondamentalmente si calcola un algoritmo MAC deterministico sul messaggio (come HMAC ) e si utilizza l'output come IV. Questo è un algoritmo a due passaggi, ed è piuttosto inevitabile. Se due messaggi di origine sono identici, restituiranno lo stesso messaggio crittografato, ma se differiscono da qualche parte (anche sul loro ultimo bit), quindi, con alta probabilità, i messaggi crittografati saranno completamente diversi.
Sfortunatamente, le piattaforme per le quali la memoria e / o la casualità sono requisiti difficili (ad esempio, le smart card) sono anche piattaforme in cui la RAM è un vantaggio e un sistema a due passaggi può essere eccessivamente costoso.