AES128解密:javax.crypto.badpaddingexception pad块损坏

时间:2014-05-06 09:43:31

标签: java android exception encryption aes

我尝试解密从Web服务收到的加密数据。

使用AES 128完成加密。

我使用以下代码解密数据:

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

  

cipher.doFinal()

我得到以下例外:

  

javax.crypto.badpaddingexception pad block corrupted

我通过了我的帖子,但最终没有解决方案。我被困在这里。

3 个答案:

答案 0 :(得分:10)

SecureRandom sr = SecureRandom.getInstance("SHA1PRNG","Crypto");

完美运作

注意:此代码仅适用于Android 6以下的设备。从Android 7.0开始"Crypto" provider has been removed,因此此代码将失败。

答案 1 :(得分:3)

AES密钥应包含随机数据。如果将它们存储为String,则可能会丢失信息,尤其是在使用UTF-8等编码时。你的行:

AppConstants.AESEncryptionKey.getBytes("UTF8")

使您在转换为字符串/从字符串转换过程中丢失数据的可能性很小。如果需要字符串,请使用十六进制代码,或者只是将密钥存储为字节数组。


请注意,此答案并未指出任何与安全相关的提示。通常,您只想导出密钥或将它们存储在容器中。您也不想在不安全的渠道上使用CBC。

答案 2 :(得分:2)

在我的情况下问题是因为加密密钥和解密密钥都不同,当我检查两个具有相同值的密钥时,问题就不会出现