da quello che so, la modalità CTR non utilizza un vettore iniziale. Richiede solo un contatore, lo crittografa con una determinata chiave e quindi XOR è il risultato con il testo in chiaro per ottenere il testo cifrato.uso modalità CTR di Initial Vector (IV)
Altre modalità di cifratura a blocco come CBC prima di eseguire la crittografia XOR il testo in chiaro con un vettore iniziale.
Quindi ecco il mio problema. Ho il seguente codice in Java (utilizzando la libreria bouncycastle):
Cipher cipher = Cipher.getInstance("AES/CTR/PKCS5Padding", "BC");
cipher.init(Cipher.ENCRYPT_MODE, key);
byte[] result = cipher.doFinal("Some plaintext");
Ogni diversa chiamata del codice di cui sopra con la stessa chiave dà output diverso! Ma quando si fa:
byte[] IV = new byte[]{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
Cipher cipher = Cipher.getInstance("AES/CTR/PKCS5Padding", "BC");
cipher.init(Cipher.ENCRYPT_MODE, key, IV);
byte[] result = cipher.doFinal("Some plaintext");
Prendo lo stesso risultato in ogni chiamata del codice precedente. Ma perché è questo? Voglio dire, il CTR non ha bisogno di un IV, quindi perché quando non prendo una IV in ogni chiamata ottengo un risultato diverso e quando ho dato una IV restituisce lo stesso risultato? Se utilizzo sempre la IV precedente (tutti gli zeri) quando uso CTR, sarebbe sicuro?
Qualsiasi idea sarebbe molto utile. Grazie
[Se stai digitando le lettere AES nel tuo codice, stai sbagliando.] (Http://chargen.matasano.com/chargen/2009/7/22/if-youre-typing-the -letters-aes-into-your-code-youre-doing.html) –
Crypto è * veramente facile * rovinare. E rovinare in modi totalmente invisibili fino a quando qualcuno li sfrutta. Utilizzare invece una libreria consolidata con un'interfaccia hard-to-screw-up. –
@Anon. Ho persino scelto la mia IV, per favore vieni e uccidimi ora. (Suggerimento: alcune persone sanno cosa stanno facendo, questo consiglio generale di non digitare AES nel codice è stupido.) – Luc