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 .

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í.

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

  • No puede enviar mensajes desde el servidor: Google Cloud Messaging
  • Convertir objeto complejo de Java en Json
  • ¿Es Hibernate un exceso para una aplicación de Android?
  • ¿Por qué las cadenas de referencia de un archivo de recursos externos en lugar de codificación en la disposición de Android XML?
  • Java / Android: Obtener información de usuario de Facebook desde Graph Api, mostrar en TextView
  • Emuladores virtuales que pueden reproducir vídeos HD en android
  • Error de Eclipse, "La selección no se puede iniciar y no hay lanzamientos recientes"
  • Migración en Realm 0.81.1
  • Obtener el error "no se puede resolver el método" al intentar implementar getSharedPreferences en Android Studio
  • Eclipse android sdk bundle no puede abrir Android SDK Manager
  • Implementar pausa / reanudar en la descarga de archivos
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.