java - BadPaddingException:android 解密 block 中的填充 block 已损坏

标签 java android encryption badpaddingexception

我知道这个问题已被问过多次,但它似乎不适用于我的代码。

解密时出现异常:

“javax.crypto.BadPaddingException:填充 block 损坏”

我的代码是:

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

在dataDecryption()函数中调用cipher.doFinal()时抛出异常。此外,调用 SecureRandom 会收到此警告:“Android 4.3 及更早版本上可能存在不安全的随机数。阅读 https://android-developers.blogspot.com/2013/08/some- securerandom-thoughts.html 了解更多信息。”

我正在使用 RandomAccessFile 和 FileOutputStream 读取和写入文件,因此我直接使用字节数组。

我已经查看了另一个问题并按照它的说明修改了我的代码,但仍然不起作用:

Encryption error on 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)

希望您能帮助我,提前致谢。

最佳答案

您忘记从密文中删除 IV。

尝试:

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

而不是

return cipher.doFinal(encrypted);

dataDecryption方法中。

关于java - BadPaddingException:android 解密 block 中的填充 block 已损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26693239/

相关文章:

java - 线程问题 : program doesn't start

android - 德尔福 10.1 Android 应用程序。如何将单字节文本作为 JString 传递。

java - 在 Objective-C 中加密并在 Java 中解密的算法

java - 每条消息都需要 Cipher.init() 吗?

java - Java 中的分析是否会带来性能问题?

java - 斐波那契数列,如何找到该数(java)

android - 当我添加一个新字段时,我得到一个空指针

javascript - 如何在node.js中加密文件?

java - 为什么从 Spring Boot 版本 2.1.4 更改为 2.1.5 会出现未知配置 Maven 错误?

android - 在 Jetpack Compose 中以约束方式显示两个文本的行