BadPaddingException: блок планшета поврежден в блоке дешифрования Android

Я знаю, что этот вопрос задавался несколько раз, но, похоже, он не работает с моим кодом.

Я получаю исключение при расшифровке:

"javax.crypto.BadPaddingException: поврежден блок пэдов"

Мой код:

private static byte[] appendIvToEncryptedData(byte[] eData, byte[] iv) throws Exception {
       ByteArrayOutputStream os = new ByteArrayOutputStream();
       os.write(eData);
       os.write(iv);
       return os.toByteArray();
    }

protected static byte[] dataEncryption(byte[] plainText)
    throws Exception {
    Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
    SecureRandom random = SecureRandom.getInstance("SHA1PRNG", "Crypto");
    byte [] iv = new byte[Constants.AES_BYTE_LENGTH];
    random.nextBytes(iv);
    AlgorithmParameterSpec paramSpec = new IvParameterSpec(iv);
    SecretKeySpec secretKeySpec = new SecretKeySpec(mAESKey, "AES");
    cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, paramSpec);
    return appendIvToEncryptedData(cipher.doFinal(plainText), cipher.getIV());
}


protected static byte[] dataDecryption(byte[] encrypted)
    throws Exception {
    int ivIndex = encrypted.length - Constants.AES_BYTE_LENGTH;
    Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
    SecretKeySpec secretKeySpec = new SecretKeySpec(mAESKey, "AES");
    cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, 
            new IvParameterSpec(encrypted, ivIndex, Constants.AES_BYTE_LENGTH));

    return cipher.doFinal(encrypted);
}

Исключение выдается при вызове cipher.doFinal() в функции dataDecryption(). Кроме того, вызов SecureRandom получил это предупреждение: "Потенциально небезопасные случайные числа на Android 4.3 и старше. Для получения дополнительной информации прочитайте https://android-developers.blogspot.com/2013/08/some- securerandom-ideas.html".

Я читаю и пишу файлы, используя RandomAccessFile и FileOutputStream, поэтому я работаю напрямую с байтовыми массивами.

Я посмотрел на этот другой вопрос и изменил свой код, как он говорит, но все еще не работает:

Ошибка шифрования на Android 4.2

Кстати, я шифрую на одном устройстве, а расшифровываю на другом.

Это моя трассировка стека:

11-01 20:57:14.820: I/Exception(26336): javax.crypto.BadPaddingException: pad block corrupted
11-01 20:57:14.820: I/Exception(26336):     at com.android.org.bouncycastle.jce.provider.JCEBlockCipher.engineDoFinal(JCEBlockCipher.java:701)
11-01 20:57:14.820: I/Exception(26336):     at javax.crypto.Cipher.doFinal(Cipher.java:1106)
11-01 20:57:14.820: I/Exception(26336):     at com.example.example.KeyManagement.dataDecryption(KeyManagement.java:132)
11-01 20:57:14.820: I/Exception(26336):     at com.example.example.SecureReceiving$1.onEvent(SecureReceiving.java:86)
11-01 20:57:14.820: I/Exception(26336):     at android.os.FileObserver$ObserverThread.onEvent(FileObserver.java:125)
11-01 20:57:14.820: I/Exception(26336):     at android.os.FileObserver$ObserverThread.observe(Native Method)
11-01 20:57:14.820: I/Exception(26336):     at android.os.FileObserver$ObserverThread.run(FileObserver.java:88)

Надеюсь, вы можете помочь мне, спасибо заранее.

1 ответ

Решение

Вы забыли удалить IV из зашифрованного текста.

Пытаться:

return cipher.doFinal(encrypted, 0, ivIndex);

вместо

return cipher.doFinal(encrypted);

в пределах dataDecryption метод.

Другие вопросы по тегам