AES加密输入长度错误javax.crypto.IllegalBlockSizeException

时间:2015-04-24 19:26:23

标签: java encryption aes

这是我的代码:

public class Encryption {
    private static final String ALGO = "AES/CBC/PKCS5Padding";
    private static final byte[] keyValue = new byte[]{'F','O','R','T','Y','T','W','O','F','O','R','T','Y','T','W','O'};
    private static Key key = generateKey();

    public static String encrypt(String DATA) throws Exception {
        Cipher c = Cipher.getInstance(ALGO);
        c.init(Cipher.ENCRYPT_MODE,key,new IvParameterSpec(c.getParameters().getParameterSpec(IvParameterSpec.class).getIV()));
        byte[] encVal = c.doFinal(DATA.getBytes());
        String encryptedValue = new BASE64Encoder().encode(encVal);
        return encryptedValue;
    }

    public static String decrypt(String DATA) throws Exception {
        System.out.println(DATA.length());
        Cipher c = Cipher.getInstance(ALGO);
        c.init(Cipher.DECRYPT_MODE, key, new IvParameterSpec(c.getParameters().getParameterSpec(IvParameterSpec.class).getIV()));
        byte[] dencVal = c.doFinal(DATA.getBytes());
        String decryptedValue = new BASE64Encoder().encode(dencVal);
        return decryptedValue;

    }
    public static Key generateKey() {
            Key key = new SecretKeySpec(keyValue,"AES");
            return key;
    }
}

我收到了这个错误:

Error:Exception in thread "main" javax.crypto.IllegalBlockSizeException: Input length must be multiple of 16 when decrypting with padded cipher
    at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:913)
    at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:824)
    at com.sun.crypto.provider.AESCipher.engineDoFinal(AESCipher.java:436)
    at javax.crypto.Cipher.doFinal(Cipher.java:2165)
    at Encryption.decrypt(Encryption.java:30)
    at EncryptionTest.main(EncryptionTest.java:9)

我做错了什么?

2 个答案:

答案 0 :(得分:1)

AES/CBC/PKCS5Padding是" block cipher"这意味着在固定大小的块上工作,在这种情况下为16字节。必须使用额外字节填充较小尺寸的输入以进行加密。

解密,因为它正在计算加密操作的输出,必须已经是块大小的倍数。例外情况是告诉您没有提供正确的加密数据,因为输入不是块大小的倍数。

解码应始终与编码相反,因此如果您通过执行"加密然后编码base64-encode"那么解码必须是" base64-decode然后解密"。你的方法是"解密然后base64-encode"这显然是一个错误。

答案 1 :(得分:0)

如果您使用的是加密方法的返回值,则无法正常工作。

您加密然后编码加密结果。之后,您尝试解密编码的值。您必须首先解码,然后尝试解密。