2013-05-27 15 views
5

Il mio reparto al lavoro è richiesto dal potere di utilizzare una libreria di crittografia scritta da un altro reparto, il problema è che la libreria di crittografia ha codificato il proprio AES vettore di inizializzazione della modalità contatore (tutti zeri). (Fondamentalmente, l'altro dipartimento ha preso la biblioteca di Bouncycastle e gli ha avvolto il proprio codice.) Abbiamo documentato i problemi con questo codice per i poteri, quindi ora, a meno che la direzione non decida di agire, siamo bloccati usando una libreria di crittografia rotta .Modalità contatore AES - la libreria di crittografia ha codificato il proprio vettore di inizializzazione

Mi chiedo se potremmo simulare un vettore di inizializzazione appropriato anteponendo un IV univoco al testo in chiaro e quindi troncando i primi sedici byte di testo in chiaro dopo la decrittografia, ad es.

ciphertext = encrypt(++sixteenByteCounter + plaintext) 
plaintext = decrypt(ciphertext).subArray(16, ciphertext.length) 

Questo sembra che vada bene per me, ma io sono certo un esperto di crittografia

+0

No, troncare qualsiasi cosa non farà nulla di buono :). IV viene utilizzato per concatenare le modalità e prende parte alla crittografia. –

+0

@ EugeneMayevski'EldoSCorp Un IV viene comunemente utilizzato anche come valore iniziale per il nonce nella crittografia in modalità contatore. E penso che la domanda fosse di ottenere maggiore sicurezza preponendo un valore, non troncando il testo in chiaro decifrato. –

+0

Non ti servirà a niente. Il 96 bit superiore del contatore DEVE essere univoco per messaggio, altrimenti un semplice xor tra i messaggi comprometterà i dati. L'aggiunta di spazzatura da crittografare non aiuterà qui. L'implementazione deve essere modificata. –

risposta

5

Noooooo ....

In modalità CTR si sta cifrando una sequenza di numeri (1,2,3 ...) e poi XORing il tuo messaggio contro quello.

E 'notoriamente facile da decifrare la crittografia che i valori XOR nei confronti di una sequenza riutilizzati. Quindi, per evitare ciò in modalità CTR, inizi ogni volta con un offset casuale (non inizi da 1, ma a 75437454896785, ad esempio). Questo è ciò che la "IV" è in modalità CTR. Non è come una IV in catena. È un offset numerico a cui inizi a contare.

Vedere https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation#Counter_.28CTR.29 - l'IV è il "nonce" (i bit più alti nel contatore).

Ciò che suggerisci sembra essere basato sulla modalità CBC o simile in cui l'IV viene utilizzato per manipolare il blocco successivo, che a sua volta viene utilizzato per manipolare il blocco successivo e così via. Ma questo è completamente estraneo al modo in cui viene usato IV in modalità CTR.

La correzione non modificava il punto di partenza dei numeri utilizzati ei messaggi sarebbero irrimediabilmente insicuri. Per favore, non farlo.

Inoltre, esiste una crittografia equivalente allo stackoverflow in cui si dovrebbe davvero chiedere questo genere di cose. https://crypto.stackexchange.com/

MA ATTENDERE. Ora penso a questo ... Non conosco l'API in questione. Potrebbe essere che l'IV non sia semplicemente usato (forse l'IV nell'API è usato solo per il tipo di concatenamento fatto in CBC). Quanto è ampio il contatore? Potrebbe essere che l'API si aspetti di avviare il contatore con un offset casuale? Immagino di no, ma devi davvero leggere il documento/codice per essere sicuro (so che sono stato morso su questo problema con PyCrypto).

Ma comunque, in entrambi i casi, la correzione non è certamente una correzione (sfortunatamente).

Problemi correlati