È sicuro usare una parte della chiave come IV in AES?

3

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?

    
posta Independent 25.05.2016 - 09:20
fonte

2 risposte

5

Is it safe to use a part of the key as IV and what is best practice?

In una parola. NO.

IV è una parte fondamentale della crittografia che fa parte dell'elemento essenziale della randomizzazione. L'uso di un IV non crittografico casuale che è statico o altrimenti prevedibile come parte del processo di crittografia significa che stai potenzialmente indebolendo l'elemento di randomizzazione dell'algoritmo crittografico scelto.

Il codice di esempio di esempio usa frequentemente gli IV fissi è proprio per questo motivo. È un codice di esempio, che si trova comunemente nei libri o sui siti web. Gli autori hanno la necessità e il desiderio di mantenere il codice di esempio il più breve possibile, quindi gli IV fissi sono utilizzati per la comprensione non scritta che il lettore ha una base sufficiente nei principi della crittografia per sapere che dovrebbero usare IV casuali nella vita reale.

Se la memoria serve, Bruce Schneier ha un intero capitolo sulle IV in uno (o più) dei suoi libri. Sarebbe un ottimo punto di partenza se vuoi davvero entrare nel dettaglio della questione.

    
risposta data 25.05.2016 - 09:48
fonte
4

La risposta di Piccolo codice è corretta in quanto è assolutamente non sicuro riutilizzare parte della chiave come IV, in particolare se si intende utilizzare la chiave per crittografare più di una singola porzione di dati.

TUTTAVIA : non è ciò che sta facendo lo snippet di codice che hai indicato nella tua domanda.

Rfc2898DeriveBytes pdb = new Rfc2898DeriveBytes(password, salt);  
rijndael.Key = pdb.GetBytes(32);  
rijndael.IV = pdb.GetBytes(16);

Il modo in cui funziona Rfc2898DeriveBytes.GetBytes (), le chiamate successive restituiscono byte aggiuntivi, non gli stessi byte. Quindi chiamare GetBytes(32); e poi GetBytes(16) è funzionalmente equivoco a chiamare GetBytes(48); e quindi dividere i risultati in matrici di lunghezze 32 e 16.

Questa è una costruzione sicura se, e solo se il sale è globalmente unico. (In pratica, questo di solito significa casuale e di lunghezza appropriata.) La ragione per cui si otterrebbe sia la chiave che la IV in questo modo è perché si ha bisogno di a) memorizzare l'IV per la decrittazione o b) sapere come rigenerarlo per la decrittazione. Dal momento che abbiamo già bisogno di memorizzare il sale che usiamo come input per Rfc2898DeriveBytes , è più semplice, e ha più senso usarlo per generare sia la chiave che IV per poi dover memorizzare anche una IV. Ancora una volta, finché il sale è unico, finiremo con un IV sicuro che sarà unico per questa combinazione di password / sali.

    
risposta data 25.05.2016 - 16:00
fonte

Leggi altre domande sui tag