【1】javax.crypto.BadPaddingException: Given final block not properly padded
背景 : windows加密解密正常,windows加密linux解密出错,linux加密,windows解密出错。同一个明文,使用AES加密中的方法,windows和linux下加密结果不同。
解决办法:将SecretKey替换为如下
/* 解决windows与linux相互加密解密出错 */
public static SecretKey generateSKey(String strKey){
try {
KeyGenerator generator = KeyGenerator.getInstance( "AES" );
SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG" );
secureRandom.setSeed(strKey.getBytes());
generator.init(128,secureRandom);
return generator.generateKey();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
调整后加密示例如下:
/**
* [加密]<BR>
*base64(aes(src,key))
*/
public static String encryptBase64(String sSrc, String sKey) throws Exception {
if (sKey == null) {
return null;
}
// 判断Key是否为16位
if (sKey.length() != 16) {
return null;
}
// 返回实现指定算法的密码对象实例
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
// 根据key产生指定算法的秘钥
// byte[] raw = sKey.getBytes();
//SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
SecretKey generateSKey = generateSKey(sKey);
IvParameterSpec iv = new IvParameterSpec(IV_INIT.getBytes());
cipher.init(Cipher.ENCRYPT_MODE, generateSKey , iv);
byte[] encrypted = cipher.doFinal(sSrc.getBytes());
//此处使用BASE64做转码功能,同时能起到2次加密的作用。
return Base64Util.encode(encrypted);
}