Qual è il punto del nonce in modalità CTR?

6

Avere un nonce in modalità CTR migliora effettivamente la sicurezza (contro solo l'utilizzo di 1, 2, 3, ecc. - in pratica un nonce costante di 0)?

Per quanto posso dire, lo scenario migliore per quanto riguarda la sicurezza è che il nonce potrebbe agire come una sorta di seconda chiave, che sarebbe anche condivisa in modo sicuro tra le parti comunicanti. Ma se il codice di blocco sottostante è sicuro (diciamo AES-128), questo dovrebbe essere sia inutile che inutile ... giusto?

Mi sembra che specificare un nonce dia solo un falso senso di maggiore sicurezza. Mi manca qualcosa?

    
posta Neil Fitzgerald 15.07.2014 - 21:07
fonte

2 risposte

18

Il "nonce" è meglio conosciuto come Vettore di inizializzazione - con "IV" come abbreviazione universale per quel concetto. La modalità CTR funziona crittografando i valori successivi di un contatore (CTR sta per "CounTeR"), quindi l'IV in modalità CTR è semplicemente il valore a cui inizia il contatore.

Il CTR produce fondamentalmente un flusso pseudocasuale dipendente dalla chiave lungo e la crittografia si verifica da XORing che esegue lo streaming con i dati da crittografare; in questo senso, è molto simile a One-Time Pad , tranne per il fatto che lo stream chiave viene generato con AES ( come una sorta di PRNG): questo vanifica la grandezza matematica di OTP, cioè la sua assoluta sicurezza, ma rende lo schema utilizzabile in pratica.

Usare un IV di valore zero va bene ... finché lo fai solo una volta. Se si riutilizza un valore contatore (con la stessa chiave) per un'altra corsa, si finisce con la stessa cosa di OTP dove il "pad" non è "una tantum". Questa è una pausa classica. L'idea è che, per un dato tasto , dovresti considerare ogni valore del contatore come "bruciato" ogni volta che lo usi. Se si esegue una prima esecuzione di crittografia a partire dal valore contatore 0, i valori del contatore verranno utilizzati da 0 a, ad esempio 12782 (ad esempio se i dati crittografati hanno una durata di 276525 byte). Se non si modifica la chiave, NON si deve riutilizzare nessuno dei valori del contatore da 0 a 12782. La successiva esecuzione della crittografia con quella chiave deve iniziare con IV = 12783.

Viceversa, rimanere fedeli a un IV di valore 0, sempre, sarà sicuro finché si utilizza il tasto AES solo una volta. Ciò avrebbe senso in un protocollo simile a SSL, in cui una chiave di crittografia specifica della connessione è negoziata durante un iniziale handshake, utilizzato per quella connessione, quindi lasciata per sempre.

Più in generale, la maggior parte delle modalità di funzionamento per i codici a blocchi usano una IV (perché hanno un certo "stato di esecuzione" che deve iniziare da qualche parte) e i requisiti per questi IV dipendono dalla modalità. Il CTR può tollerare un IV fisso se non si riutilizza la chiave per un'altra corsa. CBC non lo tollera nemmeno, perché un IV prevedibile può essere sfruttato per attacchi con testo in chiaro.

    
risposta data 15.07.2014 - 21:20
fonte
1

Questa è un'ipotesi casuale in quanto non sono un esperto ...

Per rispondere alla domanda nel titolo, "Qual è il punto del nonce in modalità CTR?", direi che è rendere il protocollo stateless . Significa che entrambe le parti non hanno bisogno di memorizzare alcuna informazione al fine di criptare / decifrare più esecuzioni, eccetto la chiave.

Per comprendere la dichiarazione di cui sopra, esaminiamo il codice di blocco e alcuni protocolli come SSL.

Un codice a blocchi è come una funzione con due argomenti, chiave e input. Se fornite gli stessi due argomenti (tasto + input) due volte produrrà sempre lo stesso risultato.

In SSL, si genera all'inizio una chiave simmetrica che verrà utilizzata per crittografare / decodificare molti messaggi diversi. Quindi, uno dei tuoi argomenti nel codice a blocchi è già stato corretto per l'intera conversione. Ciò significa che non devi mai ripetere il secondo o si produrrebbe lo stesso output dal codice a blocchi due volte.

Perché è sbagliato produrre lo stesso output dal codice a blocchi due volte?

È cattivo perché ti rende vulnerabile a ripetere l'attacco. Se è corretto produrre lo stesso output dal codice di blocco due volte, vuol dire che è giusto che un utente malintenzionato invii di nuovo uno dei vecchi messaggi durante la conversazione e il server lo accetterà volentieri.

Quindi, è questo il motivo per cui abbiamo bisogno di un nonce?

Sì e no.

Se hai risolto il problema, sei a posto finchè non riutilizzi mai la stessa chiave con lo stesso contatore durante l'intera conversazione, che potrebbe includere molti messaggi. Quindi, sia il client che il server devono conoscere l'ultimo valore del contatore, quindi dovrebbero mantenere uno stato.

Usando un nonce, facciamo l'ipotesi che non avremo mai lo stesso input che è formato dalla combinazione del nonce e del contatore. Quindi, non è necessario mantenere alcun stato.

    
risposta data 15.07.2014 - 22:06
fonte

Leggi altre domande sui tag