Java异常:java.security.InvalidKeyException: Illegal key size
出现问题的代码
1 public static String aesEncrypt(String content, String key) { 2 try { 3 if (key == null) { 4 System.err.println("key为空null"); 5 return null; 6 } 7 key = MD5Util.encodeMD5(key, CHARSET); 8 // 判断Key是否为32位 9 if (key.length() != 32) { 10 System.err.println("key长度不是32位"); 11 return null; 12 } 13 Security.addProvider(new BouncyCastleProvider()); 14 SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes(), "AES"); 15 IvParameterSpec ivSpec = new IvParameterSpec(IVS.getBytes());// 使用CBC模式,需要一个向量,可增加加密算法的强度 16 Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding");// "算法/模式/补码方式" 17 cipher.init(Cipher.ENCRYPT_MODE, skeySpec, ivSpec); 18 byte[] encrypted = cipher.doFinal(content.getBytes()); 19 return Base64.encode(encrypted);// 此处使用BASE64做转码功能,同时能起到2次加密的作用。 20 } catch (Exception e) { 21 e.printStackTrace(); 22 return null; 23 } 24 }
原因
在Java8中,如果密钥大于128, 会抛出java.security.InvalidKeyException: Illegal key size 异常. 因为密钥长度是受限制的, java运行时环境读到的是受限的policy文件. 文件位于${java_home}/jre/lib/security, 这种限制是因为美国对软件出口的控制.
解决
需要下载两个jar包进行覆盖,下载地址
链接:https://pan.baidu.com/s/1xYIKWfdw3jDd-dDUpwl0kg
提取码:3qtn
下载后解压,可以看到local_policy.jar和US_export_policy.jar以及readme.txt 。
如果安装了JRE,将两个jar文件放到%JRE_HOME%\lib\security目录下覆盖原来的文件。
如果安装了JDK,还要将两个jar文件也放到%JDK_HOME%\jre\lib\security目录下覆盖原来文件。