原创

Given final block not properly padded异常解决方案

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);

参考:

  1. JAVA AES加解密在linux中的问题  
  2. https://www.cnblogs.com/digdeep/p/5580244.html  
正文到此结束