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包進行覆蓋,下載地址

  鏈接://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目錄下覆蓋原來文件。