AES解密:javax.crypto.BadPaddingException:在Android中损坏了pad块

时间:2012-12-27 12:19:21

标签: android exception encryption aes

我在Android应用程序中遇到AES解密问题。我已经搜索了很多但无法得到解决方案。

以下是我正在做的步骤。

  • 使用我的密钥发送到Web服务器来加密信用卡号。
  • 网络服务器解密信用卡号并保存。
  • 当我们从网络服务中获取信用卡号时。
  • 然后,网络服务器使用相同的密钥加密信用卡号码并发送给我们。
  • 现在当我们解密这个号码时,它会抛出一些信用卡号码信息的填充异常。

来自服务器的加密信息也不相同,我们以加密格式发送的信息。 虽然在iPhone应用程序中完成了同样的事情,但iPhone能够成功解密信息。

我使用以下代码进行加密和解密。

public class AES256Cipher {

    public static byte[] ivBytes = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };

    public static String AES_Encode(String str, String key) throws java.io.UnsupportedEncodingException, NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException {

        byte[] textBytes = str.getBytes("UTF-8");
        AlgorithmParameterSpec ivSpec = new IvParameterSpec(ivBytes);
             SecretKeySpec newKey = new SecretKeySpec(key.getBytes("UTF-8"), "AES");
             Cipher cipher = null;
        cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
        cipher.init(Cipher.ENCRYPT_MODE, newKey, ivSpec);

        return Base64.encodeToString(cipher.doFinal(textBytes), 0);
    }

    public static String AES_Decode(String str, String key) throws java.io.UnsupportedEncodingException, NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException {

        byte[] textBytes =Base64.decode(str,0);
        //byte[] textBytes = str.getBytes("UTF-8");
        AlgorithmParameterSpec ivSpec = new IvParameterSpec(ivBytes);
        SecretKeySpec newKey = new SecretKeySpec(key.getBytes("UTF-8"), "AES");
        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
        cipher.init(Cipher.DECRYPT_MODE, newKey, ivSpec);
        return new String(cipher.doFinal(textBytes), "UTF-8");
    }

请建议。

修改 我还有一件事,它适用于< 16位数信息。当我们输入16位数信息时,它会在解密时抛出异常。

1 个答案:

答案 0 :(得分:3)

如果服务器遇到未映射到特定字符的未知编码,则密钥将无法正常传输并偶尔失败,从而导致密钥不正确。密文是使用base64编码的,所以可能没问题,但你的密钥可能不那么幸运。

请注意,密钥的任何更改或密文的最后一个块可能都会导致BadPaddingException