Encriptación de Android "bloque pad bloqueado" excepción

En este código, esta línea está causando una excepción:

clearText = c.doFinal(Base64.decode(encryptedText, Base64.DEFAULT));

javax.crypto.BadPaddingException: pad block corrupted

Conseguí el código de: http://www.techrepublic.com/blog/software-engineer/attention-android-developers-keep-user-data-safe/

¿Algunas ideas?

  private String decrypt (String encryptedText) { byte[] clearText = null; try { SecretKeySpec ks = new SecretKeySpec(getKey(), "AES"); Cipher c = Cipher.getInstance("AES"); c.init(Cipher.DECRYPT_MODE, ks); clearText = c.doFinal(Base64.decode(encryptedText, Base64.DEFAULT)); return new String(clearText, "UTF-8"); } catch (Exception e) { return null; } } 

Detalles: También lo estoy cifrando en el android

Java + Android + Encryption + Exception significa sólo una cosa normalmente, alguien está usando la clase SecureRandom nuevo como una función de derivación clave. Esto falla cuando la implementación de SecureRandom de "SHA1PRNG" no se comporta como la implementación de Sun en Java SE. Especialmente si la semilla se añade al estado del generador de números aleatorios en lugar de la semilla que se utiliza como punto de partida del PRNG.

Básicamente, simplemente utilice SecretKey aesKey = new SecretKeySpec(byte[] keyData, "AES") lugar, o si inicia con una contraseña, pruebe a generar la clave utilizando PBKDF2.

El consejo de owlstead fue útil, pero para este caso al usar el código en

Atención a los desarrolladores de Android: Mantenga la seguridad de los datos de usuario http://www.techrepublic.com/blog/software-engineer/attention-android-developers-keep-user-data-safe/

Hice algunos cambios en el código que podrían ser útiles para otras personas en el futuro. He eliminado completamente el método getkey.

 private static String seed; /** * Encrypts the text. * @param clearText The text you want to encrypt * @return Encrypted data if successful, or null if unsucessful */ protected String encrypt(String clearText) { byte[] encryptedText = null; try { byte[] keyData = seed.getBytes(); SecretKey ks = new SecretKeySpec(keyData, "AES"); Cipher c = Cipher.getInstance("AES"); c.init(Cipher.ENCRYPT_MODE, ks); encryptedText = c.doFinal(clearText.getBytes("UTF-8")); return Base64.encodeToString(encryptedText, Base64.DEFAULT); } catch (Exception e) { return null; } } /** * Decrypts the text * @param encryptedText The text you want to encrypt * @return Decrypted data if successful, or null if unsucessful */ protected String decrypt (String encryptedText) { byte[] clearText = null; try { byte[] keyData = seed.getBytes(); SecretKey ks = new SecretKeySpec(keyData, "AES"); Cipher c = Cipher.getInstance("AES"); c.init(Cipher.DECRYPT_MODE, ks); clearText = c.doFinal(Base64.decode(encryptedText, Base64.DEFAULT)); return new String(clearText, "UTF-8"); } catch (Exception e) { return null; } } 

I Reffred De esto: https://androidfreetutorial.wordpress.com/2017/03/14/android-encryptiondecryption-with-aes-algorithm/

Cambie a " AES " de " AES / ECB / PKCS7Padding ";

  • Carácter turco en SQLite mientras utiliza la expresión LIKE
  • KeyDispatchingTimedOut mientras usa el emulador
  • Andengine FPS bajo en ciertos teléfonos
  • Longitud máxima del método PutExtra de Intención? (Cierre de la fuerza)
  • Error: - Error de ejecución de la tarea ': app: dexDebug' en android studio
  • ¿Debo aprender Java antes de aprender Android
  • Campos estáticos en Android
  • Cómo hacer el "export jar" de Eclipse desde la línea de comandos
  • ¿Cómo puedo iterar a través de las propiedades id de la clase R.java?
  • El uso de memoria no disminuye ni siquiera reciclo bitmaps
  • ¿Cómo utilizar el algoritmo de relleno de inundación en Android?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.