Исключение шифрования для Android-шифрования

В этом коде эта строка вызывает исключение:

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

javax.crypto.BadPaddingException: pad block corrupted

Я получил код от: http://www.techrepublic.com/blog/software-engineer/attention-android-developers-keep-user-data-safe/

Есть идеи?

  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; } } 

Подробности: я также шифрую его на андроиде

Java + Android + Шифрование + Исключение означает только одну вещь, кто-то снова использует класс SecureRandom в качестве функции деривации ключа. Это не удается, когда реализация SecureRandom "SHA1PRNG" не ведет себя так же, как реализация Sun в Java SE. Особенно, если семя добавляется к состоянию генератора случайных чисел вместо затравки, используемой в качестве начальной точки PRNG.

В принципе, просто используйте SecretKey aesKey = new SecretKeySpec(byte[] keyData, "AES") вместо этого, или – если вы начинаете с пароля – попробуйте и сгенерируйте ключ, используя PBKDF2.

Совет owlstead был полезен, но для этого случая при использовании кода в

Внимание Разработчики Android: Храните данные пользователя в безопасности http://www.techrepublic.com/blog/software-engineer/attention-android-developers-keep-user-data-safe/

Я внесла некоторые изменения в код, который может быть полезен другим людям в будущем. Я полностью удалил метод 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 Из этого: https://androidfreetutorial.wordpress.com/2017/03/14/android-encryptiondecryption-with-aes-algorithm/

Изменить на « AES » из « AES / ECB / PKCS7Padding »;