关于“Cannot find any provider supporting AES/ECB/PKCS7Padding”问题的解决方案-程序员宅基地

技术标签: java  开发工具  数据库  

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

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

https://crypto.stackexchange.com/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 org.apache.commons.codec.binary.Base64;
import org.bouncycastle.jce.provider.BouncyCastleProvider;

import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.io.UnsupportedEncodingException;
import java.security.*;
import java.security.spec.InvalidParameterSpecException;

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

    static {
        //BouncyCastle是一个开源的加解密解决方案,主页在http://www.bouncycastle.org/
        Security.addProvider(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 = Cipher.getInstance("AES/CBC/PKCS5Padding");
            SecretKeySpec spec = new SecretKeySpec(keyByte, "AES");
            AlgorithmParameters parameters = AlgorithmParameters.getInstance("AES");
            parameters.init(new IvParameterSpec(ivByte));
            cipher.init(Cipher.DECRYPT_MODE, spec, parameters);// 初始化
            byte[] resultByte = cipher.doFinal(dataByte);
            if (null != resultByte && resultByte.length > 0) {
                String result = new String(resultByte, encodingFormat);
                return result;
            }
            return null;
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (NoSuchPaddingException e) {
            e.printStackTrace();
        } catch (InvalidParameterSpecException e) {
            e.printStackTrace();
        } catch (InvalidKeyException e) {
            e.printStackTrace();
        } catch (InvalidAlgorithmParameterException e) {
            e.printStackTrace();
        } catch (IllegalBlockSizeException e) {
            e.printStackTrace();
        } catch (BadPaddingException e) {
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        return null;
    }


}

 

在这段代码可以运行之前,还有一个问题需要解决。
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/Amos-Turing/p/9620932.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/dongchan1847/article/details/101849248

智能推荐

ctags 和Makefile的简单使用-程序员宅基地

文章浏览阅读141次。ctagsctags是vim下方便代码阅读的工具。尽管ctags也可以支持其它编辑器,但是它正式支持的只有VIM。并且VIM中已经默认安装了Ctags,它可以帮助程序员很容易地浏览源代码。(尤其是大型的工程)一、安装ctags1、命令行安装切换到root用户之下,输入yum install ctags2、下载源码安装(网上提供的方法) 1)从http://ctag..._ctags makefile

Vue+Element ui 根据后台返回数据设置动态表头_vue+element怎么存储定义的表头数据-程序员宅基地

文章浏览阅读6.6k次,点赞6次,收藏31次。<el-table class="tb-edit" highlight-current-row :data="table_orderStatistic" border style="width: 100_vue+element怎么存储定义的表头数据

eclipse导入多模块modules的maven项目_eclipse 导入多模块maven项目-程序员宅基地

文章浏览阅读4.8k次。1、在 eclipse 中检出项目右键 --》Import --》Git --》 Projects from Git --》 Clone URL --》 http://XXX.git --》Next --》Directory(选择代码存放位置)--》勾选Import as general project --》Finish2、转为Maven项目选中检出的项目右键 --》 ..._eclipse 导入多模块maven项目

postman在接口请求之前先请求其他接口_postman怎么在请求前调用上一个request请求-程序员宅基地

文章浏览阅读2.9k次,点赞2次,收藏6次。前置条件_postman怎么在请求前调用上一个request请求

[置顶] JAVA识别身份证号码,H5识别身份证号码,tesseract-ocr识别(一)(转)-程序员宅基地

文章浏览阅读135次。背景介绍:这段时间正在做一个流动人口管理项目,其中要求使用H5网页拍照识别身份证,当时就蒙圈了,这不是APP的功能吗?产品为了快速迭代一直把APP的功能往H5上堆砌,没办法只有想办法解决了。查了一些资料,发现除了收费的OCR(百度、云脉等等)比较好的并支持中文的就只有tesseract了,当然我收费的OCR我也没测试。暂时决定使用tesseract了。思路介绍我的思路是这样的:由..._java 身份证图片号码识别

iOS 实现二维码的彩色效果_ios 二维码美化-程序员宅基地

文章浏览阅读2.9k次。今天做项目基本是完成了,测试也进入尾声,同事给我说要我把二维码变成彩色的,我对着原来前辈写的工程研究来研究去,找了很多资料还是没弄好,还是一直失败,于是找了一下我同学,问了一下他,结果他上班没时间帮我看,但是却帮我开了脑洞,我突然发现自己太死板了,死磕在原来代码上,其实到github上搜一搜有很多写好的代码供我使用,但是我没有想到,工作是讲究效率的,学习可以死磕,但是工作上一定要头脑灵活,学会使用_ios 二维码美化

随便推点

前端开发之SEO(搜索引擎优化)_前端seo优化-程序员宅基地

文章浏览阅读4.8k次,点赞7次,收藏63次。此文章是我看到两篇总结得非常好的文章,但怕之后链接失效,就复制了大部分内容,并对其中一些内容做了些修改或补充。原链接在结尾处。SEO(search engine optimization),传说中的搜索引擎优化。是指为了增加网页在搜索引擎自然搜索结果中的收录数量以及提高网站排名而做的优化行为。作为前端开发工程师,你不需要精通SEO,但你必须要了解它。它没有一成不变的方案供大家套用,但总有一些人们公认的规律可以对网站进行SEO。更重要的是我们要有自己的实践,不断发现适合自己行之有效的SEO方法。_前端seo优化

怎样修改ubuntu的主机名_ubuntu修改机器名-程序员宅基地

文章浏览阅读2.3k次。 修改ubuntu的主机名首先确定主机名就是@后面的东西vi 编辑器就可以修改vi /etc/hostname _ubuntu修改机器名

quasar 路由笔记_quasar router-程序员宅基地

文章浏览阅读2.4k次。quasar与vue-cli相似,在这里整理一个关于quasar路由的笔记一、路由配置实现页面跳转1.quasar的文件大概如下,我的路由配置放在router目录里2.这里我配置两个路由,首页home、登录页login,首页配置在文件static.js里,登录页配置在root.js里。首页statics.jsexport default [ // 首页 { name: 'home', path: '', component: () => imp_quasar router

解决Java运行时错误For input string:问题-程序员宅基地

文章浏览阅读3.4w次,点赞12次,收藏12次。其实问题都比较简单,只要你多花点功夫去研究原理。你发现其实都差不多的。没有什么东西是很难的_for input string:

文件权限详解-程序员宅基地

文章浏览阅读1k次,点赞10次,收藏7次。ll指令查看文件详细信息中,第一列就是文件类型。常见的文件类型有:1、 - :普通文件 (文本、源代码、图片、视频、可执行)2、 d :目录文件3、b :块设备4、c :字符设备5、l:链接文件6、p:管道文件7、s:socket文件。_文件权限

如何搭建一个vue项目(完整步骤)_vue如何搭建项目-程序员宅基地

文章浏览阅读3.4w次,点赞40次,收藏366次。一、安装node环境  1、下载地址为:https://nodejs.org/en/  2、检查是否安装成功:如果输出版本号,说明我们安装node环境成功    3、为了提高我们的效率,可以使用淘宝的镜像:http://npm.taobao.org/  输入:npm install -g cnpm –registry=https://registry.npm.taobao.org,即可安装npm镜像,以后再用到npm的地方直接用cnpm来代替就好了。    检查是否安装成_vue如何搭建项目