AES加密出现 java.security.InvalidKeyException: Illegal key size or default parameters

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错的解决办法

发表评论

发表回复

*

沙发空缺中,还不快抢~