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

在某些场合下会碰到这个情况,如微信退款结果中加密信息的解析。
出现这个问题的原因是:java自带的是PKCS5Padding填充,不支持PKCS7Padding填充。
解决办法是:通过BouncyCastle组件来让java里面支持PKCS7Padding填充。在加解密之前加上:Security.addProvider(new BouncyCastleProvider()),并给Cipher.getInstance方法传入参数"BC"来指定Java使用这个库里的加/解密算法。
举个解密的栗子:

     /** 
     * @param  byte[] bytes  要被解密的字节数组 
     * @param  byte[] key    加/解密要用的长度为32的字节数组(256位)密钥 
     * @return String  解密后的字符串 
     */  
    public static String Aes256Decode(byte[] bytes, byte[] key){  
        initialize();  
        String result = null;  
        try{  
            Cipher cipher = Cipher.getInstance(ALGORITHM, "BC");  //算法即AES/ECB/PKCS7Padding
            SecretKeySpec keySpec = new SecretKeySpec(key, "AES"); //生成加密解密需要的Key  
            cipher.init(Cipher.DECRYPT_MODE, keySpec);  
            byte[] decoded = cipher.doFinal(bytes);  
            result = new String(decoded, "UTF-8");  
        }catch(Exception e){  
            e.printStackTrace();  
        }  
        return result;  
    }  
      
    public static void initialize(){  
        if (initialized) return;  
        Security.addProvider(new BouncyCastleProvider());  
        initialized = true;  
	}  

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

官方网站提供了JCE无限制权限策略文件的下载:
JDK6的下载地址:
http://www.oracle.com/technetwork/java/javase/downloads/jce-6-download-429243.html

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

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

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

只要做了以上两步,就能正常加解密了。
如果还不行,可以参考这篇文章,里面提供了完整详细的例子和测试用例:https://www.cnblogs.com/jhuangsjtu/p/8261683.html。
这里提醒一个注意点:base64解码之后的结果,如果是字符串且是乱码,肯定是解码有问题,可以直接用数组。

参考资料

  1. https://www.cnblogs.com/jhuangsjtu/p/8261683.html
  2. http://blog.csdn.net/firas/article/details/47043335
  3. http://czj4451.iteye.com/blog/1986483
  4. https://www.cnblogs.com/jxldjsn/p/6097380.html
  • 8
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
问题的原因是找不到支持AES/ECB/PKCS7Padding的提供程序。这可能是由于缺少相关的加密算法支持所致。解决此问题的方法有几种。 首先,您可以尝试更新您的Java Development Kit(JDK)版本。较新的JDK版本通常会提供更多的加密算法支持。您可以从Oracle官方网站下载最新的JDK版本。 如果更新JDK版本没有解决问题,您可以尝试手动添加Bouncy Castle提供程序。您可以在AES加解密工具类中添加以下静态代码: ``` static { Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider()); } ``` 这将添加Bouncy Castle作为加密算法提供程序,可能会解决找不到提供程序的问题。请确保您已经正确导入Bouncy Castle库。 如果以上方法都没有解决问题,您可以尝试下载并安装JCE无限制权限策略文件。您可以从Oracle官方网站下载适用于您的JDK版本的JCE无限制权限策略文件。下载地址可以在官方网站上找到。 请注意,修改JDK的jar包可能会导致其他问题,因此在进行任何更改之前,请确保备份您的项目和相关文件。 #### 引用[.reference_title] - *1* *2* [java.security.NoSuchAlgorithmException: Cannot find any provider supporting AES/CBC/PKCS7Padding](https://blog.csdn.net/qq_26169011/article/details/126007315)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [关于“Cannot find any provider supporting AES/ECB/PKCS7Padding问题解决方案](https://blog.csdn.net/xiaoyi52/article/details/79645301)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值