关于“Cannot find any provider supporting AES/ECB/PKCS7Padding”问题的解决方案

时间:2025-02-18 09:19:51

出现这个问题的原因是:java自带的是PKCS5Padding填充,不支持PKCS7Padding填充

参考:/questions/20770072/aes-cbc-pkcs5padding-vs-aes-cbc-pkcs7padding-with-256-key-size-performance-java

/questions/9043/what-is-the-difference-between-pkcs5-padding-and-pkcs7-padding

 

需要注意的是AES/CBC/PKCS5Padding 这个参数

AES/CBC/PKCS7Padding 如果是7就不可以,部署在centos7 jdk8 的环境下就会报错“Cannot find any provider supporting AES/ECB/PKCS7Padding”

 

下面是我微信小程序解密代码:

import .Base64;
import ;

import ;
import ;
import ;
import ;
import ;
import ;
import ;
import .*;
import ;

/**
 * java对称解密的方法
 */
public class AesUtil {

    static {
        //BouncyCastle是一个开源的加解密解决方案,主页在/
        (new BouncyCastleProvider());
    }

    /**
     * AES解密
     *
     * @param data           //密文,被加密的数据
     * @param key            //秘钥
     * @param iv             //偏移量
     * @param encodingFormat //解密后的结果需要进行的编码
     * @return
     * @throws Exception
     */
    public static String decrypt(String data, String key, String iv, String encodingFormat)
            throws Exception {

        //被加密的数据
        byte[] dataByte = Base64.decodeBase64(data);
        //加密秘钥
        byte[] keyByte = Base64.decodeBase64(key);
        //偏移量
        byte[] ivByte = Base64.decodeBase64(iv);
        try {
            Cipher cipher = ("AES/CBC/PKCS5Padding");
            SecretKeySpec spec = new SecretKeySpec(keyByte, "AES");
            AlgorithmParameters parameters = ("AES");
            (new IvParameterSpec(ivByte));
            (Cipher.DECRYPT_MODE, spec, parameters);// 初始化
            byte[] resultByte = (dataByte);
            if (null != resultByte &&  > 0) {
                String result = new String(resultByte, encodingFormat);
                return result;
            }
            return null;
        } catch (NoSuchAlgorithmException e) {
            ();
        } catch (NoSuchPaddingException e) {
            ();
        } catch (InvalidParameterSpecException e) {
            ();
        } catch (InvalidKeyException e) {
            ();
        } catch (InvalidAlgorithmParameterException e) {
            ();
        } catch (IllegalBlockSizeException e) {
            ();
        } catch (BadPaddingException e) {
            ();
        } catch (UnsupportedEncodingException e) {
            ();
        }
        return null;
    }


}

 

在这段代码可以运行之前,还有一个问题需要解决。
Java本身限制密钥的长度最多128位,而AES256需要的密钥长度是256位,因此需要到Java官网上下载一个Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files。

官方网站提供了JCE无限制权限策略文件的下载:
JDK6的下载地址:
/technetwork/java/javase/downloads/

JDK7的下载地址:
/technetwork/java/javase/downloads/

JDK8的下载地址:
/technetwork/java/javase/downloads/

下载后解压,可以看到local_policy.jar和US_export_policy.jar以及。
如果安装了JRE,将两个jar文件放到%JRE_HOME%\lib\security下覆盖原来文件,记得先备份。
如果安装了JDK,将两个jar文件也放到%JDK_HOME%\jre\lib\security下。

只要做了以上两步,就能正常加解密了。