我需要通过REST发送一些加密数据。我的crypter / decrypter类如下:
public class AesCrypter {
static String IV = "AAAAAAAAAAAAAAAA";
static String aesKey = "0123456789abcdef";
public static byte[] encrypt(String unecryptedText) throws Exception {
Cipher encrypt = Cipher.getInstance("AES/CBC/PKCS5Padding", "SunJCE");
SecretKeySpec key = new SecretKeySpec(aesKey.getBytes("UTF-8"), "AES");
encrypt.init(Cipher.ENCRYPT_MODE, key,new IvParameterSpec(IV.getBytes("UTF-8")));
return encrypt.doFinal(unecryptedText.getBytes("UTF-8"));
}
public static String decrypt(String cryptedText) throws Exception{
byte[] bytes = cryptedText.getBytes(StandardCharsets.UTF_8);
Cipher decrypt = Cipher.getInstance("AES/CBC/PKCS5Padding", "SunJCE");
SecretKeySpec key = new SecretKeySpec(aesKey.getBytes("UTF-8"), "AES");
decrypt.init(Cipher.DECRYPT_MODE, key,new IvParameterSpec(IV.getBytes("UTF-8")));
return new String(decrypt.doFinal(bytes),"UTF-8"); // this line
}
}
但是我在解密方法上获得javax.crypto.BadPaddingException: Given final block not properly padded
,控制台指出错误在我用// this line
评论的行上。
我错过了什么?
答案 0 :(得分:1)
如果你试图用错误的密钥解密PKCS5填充的数据,然后取消它(它由Cipher类自动完成),你很可能会得到BadPaddingException(可能略低于255/256,大约99.61%),因为填充有一个特殊的结构,在unpad期间验证,很少的键会产生有效的填充。
所以,如果你得到这个例外,抓住它并将其视为"错误的密钥"。
当您提供错误的密码时,也会发生这种情况,然后密码用于从密钥库获取密钥,或者使用密钥生成功能将密钥转换为密钥。
当然,如果您的数据在传输中被破坏,也可能发生填充错误。
import org.apache.commons.codec.binary.Base64;
public static String base64Encode(String token) {
byte[] encodedBytes = Base64.encode(token.getBytes());
return new String(encodedBytes, Charset.forName("UTF-8"));
}
public static String base64Decode(String token) {
byte[] decodedBytes = Base64.decode(token.getBytes());
return new String(decodedBytes, Charset.forName("UTF-8"));
}