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?)
- Cifrar la base de datos sqlite Android:
- Obfuscate / Encrypt SharedPreferences archivo posible?
- Protección de almacenamiento local en la aplicación de parche
- Mantener la clave secreta SECRET - dentro de la aplicación para Android .. cualquier idea
- Cifrar datos en Android con un archivo RSA public.pem generado en Ruby
El cifrado es un tema nuevo para mí, así que por favor, para las respuestas amigables novato.
- Cómo almacenar la contraseña SQLcipher localmente
- Encriptación de datos en Android, AES-GCM o AES simple?
- ¿Por qué la verificación de firma en el servidor remoto es más segura que en el dispositivo?
- Android: ¿Es seguro poner una cadena sensible en mi código Java?
- Encriptación de la base de datos de Android
- ¿Cuál es el punto de cifrar anyting en Android (o Java) si el código fuente puede ser ingeniería inversa?
- No se proporcionan algoritmos de encriptación Bouncycastle
- Conectarse a WiFi abierto
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.
- Historial de uso de dispositivos móviles de Android NetworkStatsManager
- Android Studio no se compromete con GitHub