报错记录:AES加密报错:Illegal key size or default parameters解决方案

先看代码逻辑:通过hutool的AES工具类来进行加密

    /**
     * 加密
     *
     * @param content
     * @param key
     * @return
     */
    public static String encrypt(String content, String key) {
        if (StringUtils.isBlank(content) || StringUtils.isBlank(key)) {
            return null;
        }
        AES aes = new AES(Mode.ECB, Padding.PKCS5Padding, key.getBytes(StandardCharsets.UTF_8));
        return aes.encryptBase64(content);
    }

再来看问题:(这里我用的别人的报错记录,我懒得再去修改一遍程序了)

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位),导致加密/解密的失败。

之所以会出现这种问题,我们就要了解一个新的东西——JCE。在Java的核心类库中有一个JCE(Java Cryptography Extension),JCE是一组包,它们提供用于加密、密钥生成和协商以及 Message Authentication Code(MAC)算法的框架和实现,所以这个是实现加密解密的重要类库。

之所以会出现上述的报错问题:是因为AES在进行加密处理的时候并没有经果特殊的处理,但是在使用256位密钥加解密的时候,如果不进行特殊处理的话,往往会出现报“java.security.InvalidKeyException: Illegal key size or default parameters”的异常。

我们来看看大佬们是怎么说的

在这里插入图片描述

这里不难看出 java 默认是只支持 128 位的数据加密,换言之就是 16 个字节(1 byte(字节)= 8 bit(位))
所以我们不能某些 jdk 版本中 jre 自带的包,要么把 jdk 版本换掉,要么就要换掉 jre 中的 jar 包(具体哪些jar包,后文会说的)

解决方案:

一、更换JDK:推荐

我之前的版本是1.8_151的版本,既然这个报错那么就换掉他

尝试了Amazon Corretto 1.8 与 OpenJDK 1.8_251 后,选择了后者,因为前面那个也报错 …

在这里插入图片描述

二、更换jar包:这个方法我没尝试过,也觉得没啥必要,换个jdk就可以了

通过上面描述,我们知道了问题的所在,下面开始解决。我们要做的就是更换JCE的库,该文件位置在你的 JDK\jre\lib\security\policy\unlimited 目录下面,该目录下我们可以看到两个jar包:local_policy.jar,US_export_policy.jar,这两个jar包是jdk自带的。我们需要下载支持256位密钥加密的jar包。

在这里插入图片描述

备注:一定要下载与自己JDK版本一致的JCE,否则无效。

下载完后,解压,将其中的“local_policy.jar ”和“US_export_policy.jar”两个文件替换掉自己JDK\jre\lib\security\policy\unlimited文件夹下对应的原文件

JDK8:
其对应的JCE下载地址为:http://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html

JDK7:
其对应的JCE下载地址为:http://www.oracle.com/technetwork/java/javase/downloads/jce-7-download-432124.html

JDK6:
其对应的JCE下载地址为:http://www.oracle.com/technetwork/java/javase/downloads/jce-6-download-429243.html

JDK5:
acle.com/technetwork/java/javase/downloads/jce-6-download-429243.html

JDK5:
其对应的JCE下载地址为:http://download.csdn.net/detail/scs2043/4237335

参考:https://blog.csdn.net/tomatocc/article/details/85096911

Java程序在Linux服务器上运行时,如果使用AES加密并使用256位密钥,则可能会出现“java.security.InvalidKeyException: Illegal key size or default parameters”的异常。这是因为默认情况下,Java不允许使用256位密钥进行加密。要解决此问题,需要执行以下步骤: 1.下载Java Cryptography Extension (JCE) Unlimited Jurisdiction Policy Files。这些文件包含允许使用256密钥的策略文件。 2.解压缩下载的文件,并将其中的两个JAR文件(local_policy.jar和US_export_policy.jar)复制到$JAVA_HOME/jre/lib/security目录中。如果该目录中已经存在这些文件,请备份它们并替换为新文件。 3.重新启动Java应用程序并尝试使用256位密钥进行AES加密。 下面是一个示例代码,演示如何使用256位密钥进行AES加密: ```java import javax.crypto.Cipher; import javax.crypto.spec.SecretKeySpec; import java.util.Base64; public class AesEncryptionExample { private static final String ALGORITHM = "AES"; private static final String KEY = "0123456789abcdef0123456789abcdef"; public static String encrypt(String value) throws Exception { SecretKeySpec keySpec = new SecretKeySpec(KEY.getBytes(), ALGORITHM); Cipher cipher = Cipher.getInstance(ALGORITHM); cipher.init(Cipher.ENCRYPT_MODE, keySpec); byte[] encryptedValue = cipher.doFinal(value.getBytes()); return Base64.getEncoder().encodeToString(encryptedValue); } public static String decrypt(String value) throws Exception { SecretKeySpec keySpec = new SecretKeySpec(KEY.getBytes(), ALGORITHM); Cipher cipher = Cipher.getInstance(ALGORITHM); cipher.init(Cipher.DECRYPT_MODE, keySpec); byte[] decodedValue = Base64.getDecoder().decode(value); byte[] decryptedValue = cipher.doFinal(decodedValue); return new String(decryptedValue); } public static void main(String[] args) throws Exception { String originalValue = "Hello World!"; String encryptedValue = encrypt(originalValue); String decryptedValue = decrypt(encryptedValue); System.out.println("Original Value: " + originalValue); System.out.println("Encrypted Value: " + encryptedValue); System.out.println("Decrypted Value: " + decryptedValue); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我认不到你

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值