这是我的代码:
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)
我做错了什么?
答案 0 :(得分:1)
AES/CBC/PKCS5Padding
是" block cipher"这意味着在固定大小的块上工作,在这种情况下为16字节。必须使用额外字节填充较小尺寸的输入以进行加密。
解密,因为它正在计算加密操作的输出,必须已经是块大小的倍数。例外情况是告诉您没有提供正确的加密数据,因为输入不是块大小的倍数。
解码应始终与编码相反,因此如果您通过执行"加密然后编码base64-encode"那么解码必须是" base64-decode然后解密"。你的方法是"解密然后base64-encode"这显然是一个错误。
答案 1 :(得分:0)
如果您使用的是加密方法的返回值,则无法正常工作。
您加密然后编码加密结果。之后,您尝试解密编码的值。您必须首先解码,然后尝试解密。