# 在使用 AES 加密时,代码如下:

Cipher c = Cipher.getInstance(cmp);
    c.init(Cipher.ENCRYPT_MODE, sk, IV);
    byte[] result = c.doFinal(msg);

# 抛出异常:

java.security.InvalidKeyException: Illegal key size

# 异常原因:

为了数据代码在传输过程中的安全,很多时候我们都会将要传输的数据进行加密,然后等对方拿到后再解密使用。我们在使用 AES 加解密的时候,在遇到 128 位密钥加解密的时候,没有进行什么特殊处理;然而,在使用 256 位密钥加解密的时候,如果不进行特殊处理的话,往往会出现这个异常 java.security.InvalidKeyException: Illegal key size。

# 问题定位:

  • 在 Java 的核心类库中有一个 JCE(Java Cryptography Extension),JCE 是一组包,它们提供用于加密、密钥生成和协商以及 Message Authentication Code(MAC)算法的框架和实现,所以这个是实现加密解密的重要类库。
  • 在我们安装的 JRE 目录下有这样一个文件夹:% JAVE_HOME%\jre\lib\security(% JAVE_HOME% 是自己电脑的 Java 路径,一版默认是:C:\Program Files\Java,具体看自己当时安装 JDK 和 JRE 时选择的路径是什么),其中包含有两个.jar 文件:“local_policy.jar” 和 “US_export_policy.jar”,也就是我们平时说的 jar 包,再通俗一点说就是 Java 中包含的类库(Sun 公司的程序大牛封装的类库,供使用 Java 开发的程序员使用),这两个 jar 包就是我们 JCE 中的核心类库了。JRE 中自带的 “local_policy.jar ” 和 “US_export_policy.jar” 是支持 128 位密钥的加密算法,而当我们要使用 256 位密钥算法的时候,已经超出它的范围,无法支持,所以才会报:“java.security.InvalidKeyException: Illegal key size or default parameters” 的异常。

# 解决方案(系统环境为 jdk1.8):

  • 去官方下载 JCE 无限制权限策略文件。
  • JDK8 的下载地址: http://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html
  • 下载后解压,可以看到 local_policy.jar 和 US_export_policy.jar 以及 readme.txt
  • 替换(或新增)系统使用的 jre 库中 local_policy.jar 和 US_export_policy.jar 两个 jar 包

# 参考:

(https://blog.csdn.net/dling8/article/details/84061948)