Dovrei utilizzare un vettore di inizializzazione (IV) insieme alla mia crittografia?

StackOverflow https://stackoverflow.com/questions/65879

  •  09-06-2019
  •  | 
  •  

Domanda

Si consiglia di utilizzare un vettore di inizializzazione crittografare/decrittografare i miei dati?Renderà le cose più sicure?È una di quelle cose che vanno valutate caso per caso?

Per metterlo nel contesto reale, la funzione Win32 Cryptography, CryptSetKeyParam consente l'impostazione di un vettore di inizializzazione su una chiave prima della crittografia/decrittografia.Anche altre API lo consentono.

Cosa è generalmente consigliato e perché?

È stato utile?

Soluzione

Un IV è essenziale quando la stessa chiave potrebbe essere utilizzata per crittografare più di un messaggio.

Il motivo è che, nella maggior parte delle modalità di crittografia, due messaggi crittografati con la stessa chiave possono essere analizzati insieme.In un semplice codice a flusso, ad esempio, l'XORing di due testi cifrati crittografati con la stessa chiave determina lo XOR dei due messaggi, da cui il testo in chiaro può essere facilmente estratto utilizzando le tradizionali tecniche di crittoanalisi.

Un IV debole è parte di ciò che ha reso il WEP fragile.

Un IV fondamentalmente mescola alcuni dati univoci e non segreti nella chiave per evitare che la stessa chiave venga utilizzata due volte.

Altri suggerimenti

Nella maggior parte dei casi dovresti usare IV.Poiché IV viene generato in modo casuale ogni volta, se si crittografano gli stessi dati due volte, i messaggi crittografati saranno diversi e sarà impossibile per l'osservatore dire se i due messaggi sono uguali.

Osserva attentamente l'immagine (vedi sotto) della modalità CBC.Ti renderai presto conto che un attaccante che conosce l'IV è come se conoscesse un blocco precedente di testo cifrato (e sì, ne sanno già molto).

Ecco cosa dico:la maggior parte dei "problemi" con IV=0 sono problemi generali con le modalità di crittografia a blocchi quando tu non garantire l'integrità dei dati.Devi davvero garantire l'integrità.

Ecco cosa faccio:usa un checksum forte (hash crittografico o HMAC) e anteponilo al testo in chiaro prima di crittografarlo.Ecco il tuo primo blocco di testo cifrato conosciuto:è l'IV della stessa cosa senza il checksum e il checksum è necessario per un milione di altri motivi.

Finalmente:qualsiasi analogia tra CBC e cifrari a flusso non è particolarmente approfondita IMHO.

Basta guardare l'immagine della modalità CBC e penso che rimarrai piacevolmente sorpreso.

Ecco una foto:

http://en.wikipedia.org/wiki/Block_cipher_modes_of_Operation

testo del collegamento

Ho trovato l'articolo di HTTP Digest Auth (RFC2617) molto utile per comprendere l'uso e la necessità degli IV/nonces.

Se la stessa chiave viene utilizzata più volte per più segreti diversi, nei risultati crittografati potrebbero emergere modelli.L'IV, che dovrebbe essere pseudo casuale e utilizzato una sola volta con ciascuna chiave, è lì per offuscare il risultato.Non dovresti mai usare lo stesso IV con la stessa chiave due volte, ciò ne vanificherebbe lo scopo.

Per non doversi preoccupare di tenere traccia dell'IV, la cosa più semplice è anteporlo, o aggiungerlo, al segreto crittografato risultante.In questo modo non devi pensarci molto.Quindi saprai sempre che il primo o l'ultimo N bit è l'IV.

Quando decifra il segreto devi semplicemente dividere l'IV e poi usarlo insieme alla chiave per decifrare il segreto.

È una di quelle cose che devono essere valutate caso per caso?

Sì.Leggi sempre il codice che stai utilizzando e come si aspetta che appaiano i suoi input.Alcuni codici non utilizzano IV ma richiedono sali per essere sicuri.Gli IV possono avere lunghezze diverse.La modalità del codice può cambiare lo scopo per cui viene utilizzato l'IV (se viene utilizzato) e, di conseguenza, quali proprietà deve essere sicura (casuale, univoco, incrementale?).

È generalmente consigliato perché la maggior parte delle persone è abituata a utilizzare cifrari a blocchi AES-256 o simili in una modalità chiamata "Cipher Block Chaining".Questo è un buon e sensato punto di partenza predefinito per molti usi ingegneristici e richiede che tu abbia un IV appropriato (non ripetitivo).In tal caso, non è facoltativo.

L'IV consente di crittografare il testo in chiaro in modo tale che il testo crittografato sia più difficile da decrittografare per un utente malintenzionato.Ogni bit di IV utilizzato raddoppierà le possibilità di testo crittografato da un dato testo normale.

Ad esempio, crittifichiamo "ciao mondo" utilizzando un IV lungo un carattere.L'IV viene selezionato casualmente come "x".Il testo che viene poi crittografato è quindi "xhello world", che restituisce, ad esempio, "asdfghjkl".Se lo crittifichiamo di nuovo, prima generiamo un nuovo IV - diciamo che questa volta otteniamo 'b' - e crittifichiamo come al solito (crittografando così 'bhello world').Questa volta otteniamo "qwertyuio".

Il punto è che l'attaccante non sa quale sia l'IV e quindi deve calcolare ogni possibile IV per un dato testo in chiaro per trovare il testo cifrato corrispondente.In questo modo l'IV agisce come a parola d'ordine sale.Più comunemente, un IV viene utilizzato con un codice di concatenamento (un codice a flusso o a blocchi).In un codice a blocchi concatenato, il risultato di ciascun blocco di testo semplice viene inviato all'algoritmo di cifratura per trovare il testo cifrato per il blocco successivo.In questo modo, ogni blocco è concatenato insieme.

Quindi, se hai un IV casuale utilizzato per crittografare il testo normale, come lo decrittografi?Semplice.Passa l'IV (in testo normale) insieme al testo crittografato.Usando il nostro primo esempio sopra, il testo cifrato finale sarebbe 'xasdfghjkl' (IV + testo cifrato).

Sì, dovresti usare una flebo, ma assicurati di sceglierla correttamente.Usa una buona fonte di numeri casuali per realizzarlo.Non usare mai la stessa flebo due volte.E Mai utilizzare una IV costante.

L'articolo di Wikipedia su vettori di inizializzazione fornisce una panoramica generale.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top