解决 Java AES 解密报错 “Illegal key size“ 的方法

亲测有效!

当使用 AES-256 或 AES-192 加密时,JDK 默认只支持 128 位密钥,会抛出 java.security.InvalidKeyException: Illegal key size 异常。这是由于 Java 的加密强度受限于 JCE(Java Cryptography Extension)策略。以下是解决方案的详细步骤:

适用于 JDK 8u144 及更早版本

手动下载并替换 JCE 无限制加密策略文件:

  1. 访问 Oracle 官方下载页面:JCE Unlimited Strength Jurisdiction Policy Files for JDK 8
  2. 下载对应的策略文件压缩包。
  3. 解压后得到 local_policy.jarUS_export_policy.jar 两个文件。

替换原有策略文件:

  1. 定位到 $JAVA_HOME/jre/lib/security/ 目录。
  2. 备份原有的 local_policy.jarUS_export_policy.jar 文件。
  3. 将下载的两个文件复制到该目录,覆盖原有文件。
  4. 重启 JVM 以使更改生效。

适用于 JDK 8u151 及更高版本

从 JDK 8u151 开始,可以通过设置系统属性启用无限制加密策略,无需手动替换文件:

  1. 在启动 JVM 时添加以下参数:

    java 复制代码
    -Djava.security.properties=/path/to/java.security
  2. 或者在代码中设置:

    java 复制代码
    Security.setProperty("crypto.policy", "unlimited");

验证无限制策略是否生效

可以通过以下代码验证无限制策略是否已启用:

java 复制代码
import javax.crypto.Cipher;
public class CheckCryptoPolicy {
    public static void main(String[] args) throws Exception {
        int maxKeyLen = Cipher.getMaxAllowedKeyLength("AES");
        System.out.println("Max AES key length: " + maxKeyLen);
        // 如果输出 2147483647,则表示无限制策略已启用
    }
}

注意事项

  • 替换策略文件前务必备份原有文件。
  • 确保替换的文件与 JDK 版本匹配。
  • 在分布式环境中,所有运行 JVM 的节点都需要进行相同配置。
  • 某些旧版本可能需要同时替换 JDK 和 JRE 目录下的策略文件。

替代方案 如果无法修改 JCE 策略,可以考虑以下方法:

  • 使用 Bouncy Castle 加密库替代 JDK 内置实现。
  • 将加密算法降级为 AES-128。
  • 使用分段加密方式处理长密钥。

总结 通过替换 JCE 无限制策略文件或设置系统属性,可以解决 AES 加密时的密钥长度限制问题。建议优先使用官方提供的解决方案,并根据实际 JDK 版本选择合适的方法。