it-swarm-eu.dev

AES dovrebbe sempre fornire lo stesso risultato?

Ho difficoltà a comprendere AES e vorrei sapere se crittografare lo stesso testo con la stessa chiave due volte di seguito dovrebbe dare lo stesso risultato.

C'è qualche sale o qualcosa che cambierebbe l'uscita?

Se non dà la stessa cosa, come si può decifrare il messaggio (con la chiave) se il sale è casuale e non lo sa?

Se fornisce la stessa cosa, è possibile utilizzare le tabelle Rainbow per recuperare il messaggio?

22
user31008

Un blockcipher come AES è una permutazione con chiave. Nel caso di AES prende una chiave e poi trasforma un blocco di 16 byte in un altro blocco di 16 byte in modo deterministico.

Per crittografare qualcosa con un codice a blocchi è necessario utilizzare un modalità operativa . In genere queste modalità prendono un IV (simile a un salt) che dovrebbe essere diverso per ogni messaggio che crittografate. Questa differenza nel IV porta a un messaggio crittografato totalmente diverso. La crittografia dello stesso messaggio con lo stesso IV e chiave restituisce sempre lo stesso testo cifrato. La crittografia di più messaggi con lo stesso IV e chiave indebolisce la sicurezza, ma di quanto dipende dalla modalità.

Le proprietà richieste per un IV dipendono dalla modalità scelta, a volte deve essere unica (ad es. Per la modalità CTR), a volte deve essere imprevedibilmente casuale (ad es. Per la modalità CBC). Ma generalmente non deve essere segreto, quindi lo si invia al destinatario insieme al testo cifrato, in genere come prefisso.

Esistono alcune modalità progettate per la crittografia deterministica. Usando queste modalità perdi ancora se due messaggi sono uguali, ma niente di più. Dovresti usare queste modalità solo quando hai bisogno di determinismo.

28
CodesInChaos

AES è un cifra cifrata: prende come input un blocco (16 byte, nel caso di AES) e un chiave (16, 24 o 32 byte, per AES) e genera 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 di input e chiave.

Tuttavia, non crittografare un blocco, crittografare un messaggio. Il codice a blocchi è solo un elemento di costruzione; la crittografia effettiva utilizza un modalità operativa che richiama ripetutamente la cifra di blocco. Ci sono buone modalità e cattive modalità; l'obiettivo è ottenere la riservatezza del messaggio nel suo insieme e 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 facciamo no vogliamo rivelare se i due messaggi erano identici o meno, quindi qualcosa deve cambiare, da qualche parte, tra il due crittografie.

La maggior parte delle modalità operative utilizza un vettore di inizializzazione che è dove viene iniettato il non determinismo. Alcune modalità (ad es. GCM o EAX ) richiedono solo un IV non ripetitivo; un contatore può andare bene per loro e può essere implicito in alcuni contesti (ad es. quando ci sono messaggi successivi su un dato 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 il IV viene scelto in modo casuale, uniforme, con un forte PRNG e il prossimo IV da usare non è già noto quando si scelgono i dati in chiaro. il mancato rispetto di tutti questi requisiti è stato la fonte di numerosi problemi, ad es. il 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 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, quindi è possibile disporre di un sistema di crittografia completamente deterministico e senza memoria, ma non sarà compatibile con la crittografia in streaming (è necessario mantenere l'intero messaggio in memoria durante il processo). Fondamentalmente calcoli un algoritmo MAC deterministico sul messaggio (come HMAC ) e usi il suo output come IV. Questo è un algoritmo a due passaggi, ed è piuttosto inevitabile. Se due messaggi di origine sono identici, genereranno lo stesso messaggio crittografato, ma se differiscono ovunque (anche sull'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 smart card) sono anche piattaforme in cui RAM è un premio, e un sistema a due passaggi può essere eccessivamente costoso.

12
Tom Leek