según lo que sé, el modo CTR no utiliza un vector inicial. Simplemente toma un contador, lo encripta con una clave determinada y luego el resultado de XOR con texto sin formato para obtener el texto cifrado.Uso del modo CTR del vector inicial (IV)
Otros modos de cifrado de bloque como CBC antes de hacer el cifrado XOR el texto plano con un vector inicial.
Así que aquí está mi problema. Tengo el siguiente código en Java (usando la biblioteca BouncyCastle):
Cipher cipher = Cipher.getInstance("AES/CTR/PKCS5Padding", "BC");
cipher.init(Cipher.ENCRYPT_MODE, key);
byte[] result = cipher.doFinal("Some plaintext");
Cada llamada diferente del código anterior con la misma clave da salida diferente! Pero al hacer:
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");
Tomo el mismo resultado en cada llamada del código anterior. ¿Pero por qué es esto? Quiero decir, CTR no necesita un IV, entonces ¿por qué cuando no administro un IV en cada llamada obtengo un resultado diferente y cuando administro un IV, el resultado es el mismo? Si siempre utilizo el IV anterior (todos ceros) cuando uso el CTR, ¿sería seguro?
Cualquier idea sería muy útil. Gracias
[Si está escribiendo las letras AES en su código, lo está haciendo mal.] (Http://chargen.matasano.com/chargen/2009/7/22/if-youre-typing-the -letters-aes-into-your-code-youre-doing.html) –
Crypto es * realmente fácil * arruinarlo. Y meterse en formas que son totalmente invisibles hasta que alguien los explote. Use una biblioteca establecida con una interfaz difícil de destruir. –
@Anon. Incluso elijo mi IV, por favor ven y mátame ahora. (Sugerencia: algunas personas saben lo que están haciendo, este consejo general de no escribir AES en su código es estúpido.) – Luc