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