Domanda su AES-CBC IVs

3

Sto scrivendo un programma Java che crittografa le stringhe con la crittografia AES-CBC. (Alla fine aggiungerò anche funzioni di steganografia).

Come ben sai, CBC ha bisogno di un IV per cifrare il primo blocco poiché non ci sono blocchi precedenti da cui ereditare.

Ho fatto qualche ricerca sugli IV e da quello che riesco a trovare:

  • L'IV dovrebbe essere casuale
  • L'IV dovrebbe cambiare da messaggio a messaggio

Attualmente, per motivi di test / debug, sto usando un IV fisso.

Tuttavia, ora che ho risolto la maggior parte degli errori nel mio programma, sto cercando di migliorare la sicurezza rimuovendo quella versione fissa.

Quello che mi piacerebbe sapere è: È sicuro usare una seconda chiave per la IV?

Ad esempio, il mio programma richiede attualmente all'utente una chiave della lunghezza appropriata per il processo di crittografia.

Che cosa succede se ho chiesto all'utente di:

A) 2 chiavi (della stessa lunghezza, una per IV e l'altra per la crittografia effettiva)

B) 1 tasto due volte più lungo (dividendolo in due parti: il primo per la IV e il secondo per la chiave effettiva)

Sarebbe sicuro?

    
posta Android Dev 23.06.2016 - 02:17
fonte

1 risposta

6

L'IV è un valore non segreto casuale. Il suo unico scopo è impedire a due blocchi simili di produrre lo stesso testo cifrato che potrebbe fornire informazioni sulla struttura del testo normale.

In generale, si genera la IV in modo casuale e la si concatena al testo cifrato. L'IV deve essere della stessa lunghezza del blocco per AES-CBC, che è 128 bit. Puoi semplicemente concatenarlo al testo cifrato (ad es. IV + testo cifrato). Sai che i primi 16 byte saranno la IV.

Modifica

If it's common to put the IV directly in front of the ciphertext, isn't it a security risk to do it like that?

L'unico scopo del IV è quello di randomizzare il testo cifrato per evitare che due blocchi di testo in chiaro simili producano lo stesso testo cifrato. Questo è particolarmente importante per i file con una struttura fissa. Dai un'occhiata qui perché questo è importante.

In CBC devi XOR la versione del testo cifrato del blocco precedente con il blocco corrente prima di applicare AES su di esso. Il motivo per cui hai una IV è perché il primo blocco non ha un blocco-1 con XORed. Quindi si generano solo 16 byte casuali. È simile alla salatura delle password.

What makes putting a random IV in front of the ciphertext more secure than choosing a static IV?

Un IV statico vanificherebbe lo scopo in quanto avresti ancora tutti i primi blocchi simili che producono lo stesso testo cifrato.

In both cases the IV would be plainly visible. Doesn't having the IV allow you to quickly brute-force the first block?

L'IV non fa parte di AES, fa parte di una modalità operativa supportata da AES.

Vedo che sei abbastanza confuso su questi concetti. Se vuoi una buona lettura e introduzione, dovresti dare un'occhiata a "Everyday Cryptography" di Keith Martin. È un buon libro che spiega tutto passo dopo passo. La crittografia è complessa, difficile e gli errori possono avere conseguenze devastanti. Fai attenzione quando implementi le cifrature esistenti, se è utile per l'applicazione, stai meglio usando le librerie controllate e controllate.

    
risposta data 23.06.2016 - 02:56
fonte

Leggi altre domande sui tag