Qual è la differenza principale tra una chiave, un IV e un nonce?
Una chiave, nel contesto della crittografia simmetrica, è qualcosa che tieni segreto. Chiunque conosca la tua chiave (o possa indovinarla) può decifrare qualsiasi dato che hai criptato con essa (o falsificare qualsiasi codice di autenticazione che hai calcolato con essa, ecc.)
(C’è anche la crittografia “asimmetrica” o a chiave pubblica, dove la chiave ha effettivamente due parti: la chiave privata, che permette la decrittazione e/o la firma, e una chiave pubblica (derivata dalla corrispondente chiave privata) che permette la crittografia e/o la verifica della firma.)
Un IV o vettore di inizializzazione è, nel suo senso più ampio, solo il valore iniziale usato per iniziare qualche processo iterato. Il termine è usato in un paio di contesti diversi e implica diversi requisiti di sicurezza in ognuno di essi. Per esempio, le funzioni hash crittografiche hanno tipicamente un IV fisso, che è solo una costante arbitraria che è inclusa nella specifica della funzione hash ed è usata come valore hash iniziale prima che qualsiasi dato sia inserito:
Al contrario, la maggior parte dei modi di funzionamento dei block cipher richiedono un IV che sia casuale e imprevedibile, o almeno unico per ogni messaggio criptato con una data chiave. (Naturalmente, se ogni chiave viene usata solo per cifrare un singolo messaggio, si può andare avanti usando un IV fisso). Questo IV casuale assicura che ogni messaggio venga criptato in modo diverso, in modo tale che vedere più messaggi criptati con la stessa chiave non dia all’attaccante più informazioni che vedere un singolo messaggio lungo. In particolare, assicura che cifrando lo stesso messaggio due volte si ottengano due testi cifrati completamente diversi, il che è necessario affinché lo schema di cifratura sia semanticamente sicuro.
In ogni caso, l’IV non ha mai bisogno di essere tenuto segreto – se lo fosse, sarebbe una chiave, non un IV. Infatti, nella maggior parte dei casi, tenere segreto l’IV non sarebbe pratico anche se si volesse, poiché il destinatario ha bisogno di conoscerlo per decifrare i dati (o verificare l’hash, ecc.).
Un nonce, in senso lato, è solo “un numero usato solo una volta”. L’unica cosa generalmente richiesta a un nonce è che non dovrebbe mai essere usato due volte (nell’ambito pertinente, come la crittografia con una chiave particolare).Gli IV unici usati per la crittografia a cifratura a blocchi si qualificano come nonce, ma vari altri schemi crittografici fanno uso anche di nonce.
C’è qualche variazione su quale dei termini “IV” e “nonce” sia usato per i diversi modi di funzionamento dei cifrari a blocchi: alcuni autori usano esclusivamente uno o l’altro, mentre altri fanno una distinzione tra loro. Per il modo CTR, in particolare, alcuni autori riservano il termine “IV” al blocco completo di ingresso del cifrario formato dalla concatenazione del nonce e del valore iniziale del contatore (di solito un blocco di tutti i bit zero), mentre altri preferiscono non usare affatto il termine “IV” per il modo CTR. Tutto questo è complicato dal fatto che ci sono diverse variazioni su come il nonce/IV inviato con il messaggio in modalità CTR è effettivamente mappato nell’input iniziale del cifratore a blocchi.
Inversamente, per modalità diverse da CTR (o modalità correlate come EAX o GCM), il termine “IV” è quasi universalmente preferito a “nonce”. Questo è particolarmente vero per il modo CBC poiché ha dei requisiti sui suoi IV (in particolare, che siano imprevedibili) che vanno oltre il requisito usuale di unicità previsto per i nonce.
.