Ho visto molti esempi di implementazione di AES diffusi su Internet in quasi tutte le lingue che posso riconoscere. C'è una differenza che rifletto da ripetere tra tutti.
Alcuni di questi richiedono una IV e una chiave. Due entità Alcuni di loro riutilizzano una parte della chiave a 128 bit come IV. Un'entità (ai miei occhi).
Ad esempio, questo può essere trovato sulla rete
Rfc2898DeriveBytes pdb = new Rfc2898DeriveBytes(password, salt);
rijndael.Key = pdb.GetBytes(32);
rijndael.IV = pdb.GetBytes(16);
.. e l'intero campione da cui proviene questa parte è abbastanza ampio. Anche nei forum MSDN. Un altro successo in rete con 22 upvotes dice " Questo è il codice plug and play che ho trovato su Internet. Funziona solo: "
Questo mi causa mal di testa. È sicuro? Non riesco a capire perché gli autori si preoccupano di creare una funzionalità IV solo per vederlo come una scorciatoia semplicemente tagliando la chiave a metà per produrre un array di byte con dimensioni adatte a IV?
Sento che la domanda sarà più complessa perché se le diverse modalità di cifratura usano la IV in modo diverso. Inoltre può dipendere da come è costruita l'applicazione. Per esempio; la chiave intera è sempre unica? Altrimenti, come è l'entropia della chiave? E separatamente, la coppia (iv, password) è sempre unica?
Guardando molti degli esempi che popolano IV con una parte della chiave, hanno pubblicato un array statico a 16 byte con valori fissi. Nessuna indicazione o tentativo di far capire al pubblico che il campione dovrebbe essere usato per chiavi casuali di qualsiasi tipo.
È sicuro usare una parte della chiave come IV e qual è la procedura migliore?