最近在使用AES方式進行加密,本來經果測試已經沒有問題,但是在更新了密鑰key之后,就出現了下列報錯。
控制臺報錯如下:
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
網上搜索發現,由于key的變更(由原來的128位變更為256位),導致加密/解密的失敗。
原來的密鑰:lNQqkL1BfSwt2MKw
新的密鑰: P_e-BhqDPP0yeMe8Ma43ZhhL6fqevuR8
之所以會出現這種問題,我們就要了解一個新的東西——JCE。在Java的核心類庫中有一個JCE(Java Cryptography Extension),JCE是一組包,它們提供用于加密、密鑰生成和協商以及 Message Authentication Code(MAC)算法的框架和實現,所以這個是實現加密解密的重要類庫。
之所以會出現上述的報錯問題:是因為AES在進行加密處理的時候并沒有經果特殊的處理,但是在使用256位密鑰加解密的時候,如果不進行特殊處理的話,往往會出現報“java.security.InvalidKeyException: Illegal key size or default parameters”的異常。
問題解決
通過上面描述,我們知道了問題的所在,下面開始解決。我們要做的就是更換JCE的庫,該文件位置在你的JDK/jre/lib/security 目錄下面,該目錄下我們可以看到兩個jar包:local_policy.jar,US_export_policy.jar,這兩個jar包是jdk自帶的。我們需要下載支持256位密鑰加密的jar包。
備注:一定要下載與自己JDK版本一致的JCE,否則無效。
JDK8:
其對應的JCE下載地址為:http://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html
下載完后,解壓,將其中的“local_policy.jar ”和“US_export_policy.jar”兩個文件替換掉自己%JAVE_HOME%\jre\lib\security文件夾下對應的原文件(%JAVE_HOME%是自己電腦的Java路徑)。
JDK7:
其對應的JCE下載地址為:http://www.oracle.com/technetwork/java/javase/downloads/jce-7-download-432124.html
下載完后,解壓,將其中的“local_policy.jar ”和“US_export_policy.jar”兩個文件替換掉自己%JAVE_HOME%\jre\lib\security文件夾下對應的原文件(%JAVE_HOME%是自己電腦的Java路徑)。
JDK6:
其對應的JCE下載地址為:http://www.oracle.com/technetwork/java/javase/downloads/jce-6-download-429243.html
下載完后,解壓,將其中的“local_policy.jar ”和“US_export_policy.jar”兩個文件替換掉自己%JAVE_HOME%\jre\lib\security文件夾下對應的原文件(%JAVE_HOME%是自己電腦的Java路徑)。
JDK5:
其對應的JCE下載地址為:http://download.csdn.net/detail/scs2043/4237335
下載完后,解壓,將其中的“local_policy.jar ”和“US_export_policy.jar”兩個文件替換掉自己%JAVE_HOME%\jre\lib\security文件夾下對應的原文件(%JAVE_HOME%是自己電腦的Java路徑)。
擴展:
真實項目開發肯定在Linux中,前面我們知道Windos下更換JCE的方法,那么的Linux中怎么更換?如果你以為一樣去替換jar包,那就大錯特錯了,因為JDK1.8以上的該目錄下壓根沒有這兩個JAR包。(如果真有,就直接替換)
針對這種情況,我們的解決方式為:vim 命令打開java.security文件,將注釋掉的 #crypto.policy=unlimited 打開,然后保存即可