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.