AES128 Descifrado: javax.crypto.badpaddingexception pad block dañado
Intento descifrar los datos cifrados que recibo de un servicio web.
El cifrado se realiza utilizando AES 128
.
- Importar 3 SDKs, obtiene el error: Se han encontrado 3 versiones de android-support-v4.jar
- Parse Android Volley respuesta JSONArray
- ¿Por qué mi editText no presenta la salida correcta en android?
- API de la cámara: problemas con dispositivos cruzados
- Cómo llamar a Mono para la clase de Android desde la aplicación de Android?
Utilizo el código siguiente para descifrar los datos:
public static String decrypt(String strToDecrypt) { try { Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding"); //AES/CBC/PKCS7Padding SecretKeySpec secretKey = new SecretKeySpec(AppConstants.AESEncryptionKey.getBytes("UTF8"), "AES"); int blockSize = cipher.getBlockSize(); cipher.init(Cipher.DECRYPT_MODE, secretKey, new IvParameterSpec(new byte[blockSize])); //new IvParameterSpec(new byte[16]) byte decBytes[] = cipher.doFinal(Base64.decode(strToDecrypt, 0)); // byte decBytes[] = cipher.doFinal(Base64.decodeBase64(strToDecrypt)); String decStr = new String(decBytes); System.out.println("After decryption :" + decStr); return decStr; } catch (Exception e) { System.out.println("Exception in decryption : " + e.getMessage()); } return null; }
A
cipher.doFinal ()
Tengo la siguiente Excepción:
javax.crypto.badpaddingexception pad block dañado
Fui a través de mi puesto, pero terminó sin solución. Estoy muy atrapado aquí.
- Cómo encubrir el tiempo que tarda la respuesta a venir desde el servidor en android sin mostrar la pantalla en negro?
- Correo electrónico del almacenamiento interno
- Usando AES con el modo CFB
- Pasar datos a Fragmento añadido - IlligalStateException: Fragmento ya activo
- Reproductor de música Android no reindexando después de la adición de canción
- Android: Iniciar el primer plano no mostrará la notificación correctamente
- Agregar preferencias dinámicas de la casilla de verificación en Android y mostrarlas en la pantalla de preferencias?
- Cómo configurar la imagen de pantalla de bloqueo de Android
Las claves AES deben consistir en datos aleatorios. Si los almacena como una cadena, es probable que pierda información, especialmente si utiliza codificaciones como UTF-8. Su línea:
AppConstants.AESEncryptionKey.getBytes("UTF8")
Hace probable que haya perdido datos durante la conversión a / desde una cadena. Utilice hexadecimales en su lugar si necesita una cadena, o simplemente guarde la clave como una matriz de bytes.
Tenga en cuenta que esta respuesta no indica ninguna sugerencia relacionada con la seguridad. En general, sólo desea derivar las llaves o almacenarlas en contenedores. Tampoco desea utilizar CBC en un canal inseguro.
SecureRandom sr = SecureRandom.getInstance("SHA1PRNG","Crypto");
funciona perfectamente
Nota: Este código sólo funciona en dispositivos hasta Android 6. A partir de Android 7.0 se ha eliminado el proveedor "Crypto"
, por lo que este código fallará.
En mi caso el problema se produjo porque la clave encriptada y la clave descifrada son diferentes, cuando compruebo ambas claves con el mismo valor, entonces el problema no se produce
- Android: ¿por qué no puedo cambiar el valor de EditText con respecto a otro EditText?
- Tablet carpeta extraíble para la tableta