一、AES工具类
@Slf4j
public class AesUtil {
/**
* 默认的字符编码
*/
private static final String DEFAULT_CHARSET = "utf-8";
/**
* 算法
*/
private static final String ALGORITHM = "AES";
/**
* 算法/模式/填充
**/
private static final String CipherMode = "AES/ECB/PKCS5Padding";
/**
* 密钥(32位)
*/
public static final String key = "12345678123456781234567812345678";
private AesUtil() {
}
/**
* 解密AES 32位
*
* @param sSrc 解密的内容
* @param secretKey 秘钥
* @return 解密后的明文 数据
*/
public static String decrypt(String sSrc, String secretKey) {
if (secretKey == null) {
log.error("需要加密的秘钥为空");
return null;
}
try {
byte[] raw = secretKey.getBytes(DEFAULT_CHARSET);
SecretKeySpec secretKeySpec = new SecretKeySpec(raw, ALGORITHM);
Cipher cipher = Cipher.getInstance(CipherMode);
cipher.init(Cipher.DECRYPT_MODE, secretKeySpec);
// 先用base64解密
byte[] encryptedArr = Base64.getDecoder().decode(sSrc);
byte[] original = cipher.doFinal(encryptedArr);
return new String(original, DEFAULT_CHARSET);
} catch (Exception ex) {
log.error("AES解密失败", ex);
return null;
}
}
/**
* 加密32位
*
* @param sSrc 需要加密的内容
* @param sKey 秘钥
* @return 加密的内容
*/
public static String encrypt(String sSrc, String sKey) {
if (sKey == null) {
log.error("需要加密的秘钥为空");
return null;
}
try {
byte[] raw = sKey.getBytes(DEFAULT_CHARSET);
SecretKeySpec skeySpec = new SecretKeySpec(raw, ALGORITHM);
Cipher cipher = Cipher.getInstance(CipherMode);
cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
byte[] encrypted = cipher.doFinal(sSrc.getBytes(DEFAULT_CHARSET));
return Base64.getEncoder().encodeToString(encrypted);
} catch (Exception ex) {
log.error("AES加密失败", ex);
return null;
}
}
// 测试
public static void main(String[] args) {
// 明文
String str = "你好!!!";
// 加密
String encrypt = encrypt(str, key);
System.out.println(encrypt);
// 解密
String decrypt = decrypt(encrypt, key);
System.err.println(decrypt);
}
}
二、异常问题(Illegal key size or default parameters)
因为美国的出口限制,Sun通过权限文件(local_policy.jar、US_export_policy.jar)做了相应限制。因此存在以下一些问题:
1.密钥长度上不能满足需求(如:java.security.InvalidKeyException: Illegal key size or default parameters);
2.部分算法未能支持,如MD4、SHA-224等算法;
3.API使用起来还不是很方便;
4.一些常用的进制转换辅助工具未能提供,如Base64编码转换、十六进制编码转换等工具。
Exception in thread "main" java.lang.RuntimeException: Illegal key size or default parameters
at com.cupdata.oam.cardapply.kit.AesKit.decrypt(AesKit.java:98)
at com.cupdata.oam.cardapply.kit.AesKit.decrypt(AesKit.java:86)
at com.cupdata.oam.cardapply.kit.AesKit.decryptToStr(AesKit.java:56)
at com.cupdata.oam.cardapply.kit.AesKit.main(AesKit.java:194)
Caused by: java.security.InvalidKeyException: Illegal key size or default parameters
at javax.crypto.Cipher.checkCryptoPerm(Cipher.java:1026)
at javax.crypto.Cipher.implInit(Cipher.java:801)
at javax.crypto.Cipher.chooseProvider(Cipher.java:864)
at javax.crypto.Cipher.init(Cipher.java:1249)
at javax.crypto.Cipher.init(Cipher.java:1186)
at com.cupdata.oam.cardapply.kit.AesKit.decrypt(AesKit.java:94)
... 3 more
如果在运行代码时出现以上错误,很可能时你的jdk版本过低,需要进行jdk升级,jdk到1.8.0_180或1.8.0_251或1.8.0_311版本以上都可以使用!!!
也可以更换JCE的库,该文件位置在你的
JDK/jre/lib/security
目录下面,该目录下我们可以看到两个jar包:local_policy.jar
,US_export_policy.jar
,这两个jar包是jdk自带的。我们需要下载支持256位密钥加密的jar包进行替换即可。