原文:https://www.zhyd.me/article/78
JAVA的AES加密解密在windows上测试一切正常,部署到linux之后总是报异常:
javax.crypto.BadPaddingException: Given final block not properly padded...
查阅资料得知,该问题是由以下原因引起的:
private static SecretKeySpec getSecretKey(final String password) throws NoSuchAlgorithmException {
//返回生成指定算法密钥生成器的 KeyGenerator 对象
KeyGenerator kg = KeyGenerator.getInstance("AES");
//AES 要求密钥长度为 128
kg.init(128, new SecureRandom(password.getBytes()));
//生成一个密钥
SecretKey secretKey = kg.generateKey();
return new SecretKeySpec(secretKey.getEncoded(), "AES");// 转换为AES专用密钥
}
主要是红色部分的问题,修改后代码:
private static SecretKeySpec getSecretKey(final String password) throws NoSuchAlgorithmException {
//返回生成指定算法密钥生成器的 KeyGenerator 对象
KeyGenerator kg = KeyGenerator.getInstance("AES");
SecureRandom random = SecureRandom.getInstance("SHA1PRNG");
random.setSeed(password.getBytes());
//AES 要求密钥长度为 128
kg.init(128, random);
//生成一个密钥
SecretKey secretKey = kg.generateKey();
return new SecretKeySpec(secretKey.getEncoded(), "AES");// 转换为AES专用密钥
}
或者修改SecretKey的生成方式,如下:
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("AES");
DESKeySpec keySpec = new DESKeySpec(strKey.getBytes("utf-8"));
keyFactory.generateSecret(keySpec);