1. 现象
在使用AES加密会出现错误:
代码:
public static String encrypt(String sSrc, String sKey) throws Exception {
SecretKeySpec skeySpec = new SecretKeySpec(sKey.getBytes("ASCII"), KEY_ALGORITHM);
Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
cipher.init(1, skeySpec);
byte[] encrypted = cipher.doFinal(sSrc.getBytes("UTF-8"));
return byte2hex(encrypted);
}
错误提示:
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.ttg.utils.TLinxAESCoder.encrypt(TLinxAESCoder.java:34)
2. 原因:
Java几乎各种常用加密算法都能找到对应的实现。因为美国的出口限制,Sun通过权限文件(local_policy.jar、US_export_policy.jar)做了相应限制。因此存在一些问题:
- 密钥长度上不能满足需求(如:java.security.InvalidKeyException: Illegal key size or default parameters)。
- 部分算法未能支持,如MD4、SHA-224等算法。
- API使用起来还不是很方便;一些常用的进制转换辅助工具未能提供,如Base64编码转换、十六进制编码转换等工具。
本次原因是由密钥大于128字节时引起的。
3. 解决办法
Oracle在其官方网站上提供了无政策限制权限文件(Unlimited Strength Jurisdiction Policy Files),我们只需要将其部署在JRE环境中,就可以解决限制问题。
JDK6的下载地址:
http://www.oracle.com/technetwork/java/javase/downloads/jce-6-download-429243.html
JDK7的下载地址:
http://www.oracle.com/technetwork/java/javase/downloads/jce-7-download-432124.html
JDK8的下载地址:
http://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html
下载后解压,可以看到 local_policy.jar 和 US_export_policy.jar 以及 readme.txt
如果安装的是 JRE,将两个 jar 文件放到 %JRE_HOME%\lib\security
下覆盖原来文件。
如果安装的是 JDK,将两个 jar 文件放到 %JDK_HOME%\jre\lib\security
下覆盖原来文件。
参考链接
java中的AES 256算法遇到 Illegal key size or default parameters错的解决办法
发表评论
沙发空缺中,还不快抢~