• 报错记录: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);
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

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

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    网上搜索发现,由于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

  • 相关阅读:
    Python实现---南邮离散数学实验四:图的生成及欧拉(回)路的确定
    Java进阶03 IO基础
    数据合并与对比
    智云通CRM:销售的黄金法则,尊重客户的意见
    一个更好的IP工具箱MyIP
    数据结构(Java)一维数组栈
    33、CSS进阶——布局
    Android挂载系统分区执行mount和remount
    Spring MVC(下)
    机器学习第8天:SVM分类
  • 原文地址:https://blog.csdn.net/qq_57581439/article/details/128126776