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