Android AES y vector init

Tengo un problema con el cifrado y descifrado de AES: puedo cambiar completamente mi IV y todavía puedo descodificar mis datos.

public static final byte[] IV = { 65, 1, 2, 23, 4, 5, 6, 7, 32, 21, 10, 11, 12, 13, 84, 45 }; public static final byte[] IV2 = { 65, 1, 2, 23, 45, 54, 61, 81, 32, 21, 10, 121, 12, 13, 84, 45 }; public static final byte[] KEY = { 0, 42, 2, 54, 4, 45, 6, 7, 65, 9, 54, 11, 12, 13, 60, 15 }; public static final byte[] KEY2 = { 0, 42, 2, 54, 43, 45, 16, 17, 65, 9, 54, 11, 12, 13, 60, 15 }; //public static final int BITS = 256; public static void test() { try { // encryption Cipher c = Cipher.getInstance("AES"); SecretKeySpec keySpec = new SecretKeySpec(KEY, "AES"); c.init(Cipher.ENCRYPT_MODE, keySpec, new IvParameterSpec(IV)); String s = "Secret message"; byte[] data = s.getBytes(); byte[] encrypted = c.doFinal(data); String encryptedStr = ""; for (int i = 0; i < encrypted.length; i++) encryptedStr += (char) encrypted[i]; //decryoption Cipher d_c = Cipher.getInstance("AES"); SecretKeySpec d_keySpec = new SecretKeySpec(KEY, "AES"); d_c.init(Cipher.DECRYPT_MODE, d_keySpec, new IvParameterSpec(IV2)); byte[] decrypted = d_c.doFinal(encrypted); String decryptedStr = ""; for (int i = 0; i < decrypted.length; i++) decryptedStr += (char) decrypted[i]; Log.d("", decryptedStr); } catch (Exception ex) { Log.d("", ex.getMessage()); } } 

Alguna idea de lo que estoy haciendo mal? ¿Cómo puedo obtener encriptación AES de 256 bits (sólo cambia la clave a una matriz de 32 bytes?)

El cifrado es un tema nuevo para mí, así que por favor, para las respuestas amigables novato.

No está especificando un modo de cifrado, por lo que es probable que el proveedor esté predeterminado en el modo Libro de códigos electrónicos (ECB) e ignorando completamente el IV. Puede verificar esto comparando el texto cifrado producido por varias ejecuciones de su programa; Supongo que todos son idénticos.

Cipher-block encadenamiento ("CBC") es comúnmente apoyado y ampliamente utilizado, pero el modo correcto depende de su aplicación.

Usted no está especificando relleno tampoco, por lo que el proveedor está escogiendo un valor predeterminado. Lo que la JCE llama "PKCS5Padding" es una opción común para las cifras simétricas.

En lugar de especificar "AES" como el algoritmo, proporcionar una especificación completa, incluyendo algoritmo, modo y relleno, como "AES / CBC / PKCS5Padding".

No es necesario especificar el tamaño de clave AES en el nombre de Cipher ; Se deduce del tamaño de la clave que se utiliza para inicializar el cifrado.

  • Android descifrar y reproducir mp4 en tiempo de ejecución
  • Cómo agregar algoritmo bouncycastle a android
  • Android integrando PGP en un proyecto
  • Buena ingeniería de software vs. seguridad
  • Cifrar y descifrar xml
  • Almacenamiento de credenciales en la aplicación de Android
  • PBKDF2 con SHA256 en android
  • Error de descifrado de Android
  • ID de dispositivo / cuenta específica de Android para la semilla de cifrado
  • RSA Encryption: Diferencia entre Java y Android
  • ¿Cómo crear un archivo ZIP protegido con contraseña normal?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.