java PKCS7Padding 加密Cannot find any provider supporting AES/CBC/PKCS7Padding 解决办法

在java中用aes256进行加密,但是发现java里面不能使用PKCS7Padding,而java中自带的是PKCS5Padding填充,那解决办法是,通过BouncyCastle组件来让java里面支持PKCS7Padding填充。

説辣么多不如上代码:

public class AESUtil {

/**
* Encodes a String in AES-256 with a given key
*
* @param context
* @param password
* @param text
* @return String Base64 and AES encoded String
*/
public static String encode(String keyString, String stringToEncode) throws NullPointerException {
if (keyString.length() == 0 || keyString == null) {
throw new NullPointerException("Please give Password");
}

if (stringToEncode.length() == 0 || stringToEncode == null) {
throw new NullPointerException("Please give text");
}

try {
SecretKeySpec skeySpec = getKey(keyString);
byte[] clearText = stringToEncode.getBytes("UTF8");

// IMPORTANT TO GET SAME RESULTS ON iOS and ANDROID
final byte[] iv = new byte[16];
Arrays.fill(iv, (byte) 0x00);
IvParameterSpec ivParameterSpec = new IvParameterSpec(iv);

/**
* 这个地方调用BouncyCastleProvider
*让java支持PKCS7Padding
*/
Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
// Cipher is not thread safe
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding");
cipher.init(Cipher.ENCRYPT_MODE, skeySpec, ivParameterSpec);

String encrypedValue = Base64.encodeToString(cipher.doFinal(clearText), Base64.DEFAULT);
// Log.d("jacek", "Encrypted: " + stringToEncode + " -> " + encrypedValue);
return encrypedValue;

} catch (InvalidKeyException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (BadPaddingException e) {
e.printStackTrace();
} catch (NoSuchPaddingException e) {
e.printStackTrace();
} catch (IllegalBlockSizeException e) {
e.printStackTrace();
} catch (InvalidAlgorithmParameterException e) {
e.printStackTrace();
}
return "";
}

/**
* Decodes a String using AES-256 and Base64
*
* @param context
* @param password
* @param text
* @return desoded String
*/
public static String decode(String password, String text) throws NullPointerException {

if (password.length() == 0 || password == null) {
throw new NullPointerException("Please give Password");
}

if (text.length() == 0 || text == null) {
throw new NullPointerException("Please give text");
}

try {
SecretKey key = getKey(password);

// IMPORTANT TO GET SAME RESULTS ON iOS and ANDROID
final byte[] iv = new byte[16];
Arrays.fill(iv, (byte) 0x00);
IvParameterSpec ivParameterSpec = new IvParameterSpec(iv);

byte[] encrypedPwdBytes = Base64.decode(text, Base64.DEFAULT);
// cipher is not thread safe

/**
* 这个地方调用BouncyCastleProvider
*让java支持PKCS7Padding
*/
Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding");
cipher.init(Cipher.DECRYPT_MODE, key, ivParameterSpec);
byte[] decrypedValueBytes = (cipher.doFinal(encrypedPwdBytes));

String decrypedValue = new String(decrypedValueBytes);
//Log.d(LOG_TAG, "Decrypted: " + text + " -> " + decrypedValue);
return decrypedValue;

} catch (InvalidKeyException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (BadPaddingException e) {
e.printStackTrace();
} catch (NoSuchPaddingException e) {
e.printStackTrace();
} catch (IllegalBlockSizeException e) {
e.printStackTrace();
} catch (InvalidAlgorithmParameterException e) {
e.printStackTrace();
}
return "";
}

/**
* Generates a SecretKeySpec for given password
*
* @param password
* @return SecretKeySpec
* @throws UnsupportedEncodingException
*/
private static SecretKeySpec getKey(String password) throws UnsupportedEncodingException {

// You can change it to 128 if you wish
int keyLength = 256;
byte[] keyBytes = new byte[keyLength / 8];
// explicitly fill with zeros
Arrays.fill(keyBytes, (byte) 0x0);

// if password is shorter then key length, it will be zero-padded
// to key length
byte[] passwordBytes = password.getBytes("UTF-8");
int length = passwordBytes.length < keyBytes.length ? passwordBytes.length : keyBytes.length;
System.arraycopy(passwordBytes, 0, keyBytes, 0, length);
SecretKeySpec key = new SecretKeySpec(keyBytes, "AES");
return key;
}

public static void main(String args[])
{
long startTime = System.currentTimeMillis();
String encodeStr = AESUtil.encode("1234", "你要去哪儿test123");
System.out.println("encoder:"+encodeStr);
String decodeStr = AESUtil.decode("1234",encodeStr);
System.out.println("decoder:"+decodeStr);


}
}

BouncyCastle组件相关jar包bcprov-jdk15on-152.jar的下载地址:http://www.bouncycastle.org

 默认 Java 中仅支持 128 位密钥,当使用 256 位密钥的时候,会报告密钥长度错误 你需要下载一个支持更长密钥的包。这个包叫做

Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files 8

,可以从这里下载,下载地址:http://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html。下好了zip文件以后,把里面的两个jar包(local_policy.jar,US_export_policy.jar)替换掉jdk的security文件夹中相应的jar包就OK啦。

 

但是我确实遇到一个比较奇怪的问题,我在android上面调用PKCS7Padding 是没有问题的,但是在java写的服务端就有问题了。不知道为什么,我用的jdk都是1.8.0的jdk。还请各位如果有遇到相同情况的可以解答一下。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/399884.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++经典面试题(最全,面中率最高)

C经典面试题&#xff08;最全&#xff0c;面中率最高&#xff09; 1.new、delete、malloc、free关系 delete会调用对象的析构函数,和new对应free只会释放内存&#xff0c;new调用构造函数。malloc与free是C/C语言的标准库函数&#xff0c;new/delete是C的运算符。它们都可用于申…

datatables 更新选中行 的一行数据

var d table.row(.selected).data();d.columns Your-Data; table.rows(.selected).invalidate(); table.rows(.selected).data(d).draw(); 注&#xff1a; d.colums 为&#xff0c;datatables 表中 某列的 键&#xff08;key&#xff09;值 参考: https://datatables.net/re…

TP5:缩短访问路径和路由的使用——2

一、缩短访问路径 1、如图访问该文件路径 没有缩短之前&#xff0c;访问的路径是 http://localhost/zerg_new/public/index.php/api/v1/banner/1 缩短后&#xff0c;访问的路径是 http://z_new.cn/api/v1/banner/1 2、缩短路径步骤 本机apache配置&#xff0c;小编使用的…

javascript 点点滴滴01章 javascript的认知

hello world: 大家早上好 &#xff0c;所谓一年之计在于春&#xff0c;一日之计在于晨。今天开始学习 高级程序设计第三版 第二遍 以前以迅雷不及掩耳之势草草看过一遍 &#xff0c;但是什么也没记住 已经忘得差不多了。哈哈&#xff0c;原来我不是黄蓉&#xff0c;也不是天才&…

10个加速Table Views开发的Tips

2019独角兽企业重金招聘Python工程师标准>>> 本文由CocoaChina译者yake_099&#xff08;博客&#xff09;翻译&#xff0c;作者&#xff1a;David McGraw 原文&#xff1a;10 Actionable Performance Tips To Speed Up Your Table View 在我们开始之前&#xff0c;…

jquery调用asp.net 页面后台的实现代码

先创建一个aspx页面编写一个客户端控件<input type"button" id"AjaxDemo" value"AjaxDemo"> 再aspx后台的页面编写一个简单的方法,代码如下: 1 [WebMethod] 2 public static string ABC(string ABC) 3 { 4 return ABC; 5 } 必须声明…

datatable 如何修改 某行 某列 的 字体颜色

$(#example).DataTable( {"columnDefs": [{"targets": 5,"createdCell": function (td, cellData, rowData, row, col) {if (cellData 不批准) {$(td).css(color, red)}if (cellData 已批准) {$(td).css(color, green)}}}] } ); 参考&#xff…

TP5:验证器的封装——5

TP5的独立验证器如图所示&#xff1a; $validate new Validate([name > require|max:25,email > email ]); $data [name > thinkphp,email > thinkphpqq.com ]; if (!$validate->check($data)) {dump($validate->getError()); } 现在我们把验证器的封装…

资深大牛推荐学习路线建议

一位资深程序员大牛给予Java初学者的学习路线建议 java学习这一部分其实也算是今天的重点&#xff0c;这一部分用来回答很多群里的朋友所问过的问题&#xff0c;那就是我你是如何学习Java的&#xff0c;能不能给点建议&#xff1f;今天我是打算来点干货&#xff0c;因此咱们就不…

(线段树模板)A Simple Problem with Integers --POJ--3468

链接&#xff1a; http://poj.org/problem?id3468 代码&#xff1a; 1 #include<stdio.h>2 #include<algorithm>3 #include<stdlib.h>4 using namespace std;5 6 #define Lson r<<17 #define Rson r<<1|18 9 const int N 1e55;10 11 struct Se…

void和void*

1.概述  许多初学者对C/C语言中的void及void指针类型不甚理解&#xff0c;因此在使用上出现了一些错误。本文将对void关键字的深刻含义进行解说&#xff0c;并详述void及void指针类型的使用方法与技巧。  2.void的含义  void的字面意思是“无类型”&#xff0c;void *则为…

flask蓝图的使用

flask蓝图的使用 首先&#xff0c;我对蓝图的理解相对通俗&#xff0c;就是觉得蓝图对于视图方法模块化、大项目协同开发过程中的一个很好的工具. 1.下图是我们通常情况下使用的项目组织结构 看一下视图方法: #views.py1 from app import app2 3 4 app.route(/user/index)5 d…

TP5:异常处理封装——3

如果不进过异常封装&#xff0c;如果抛出一异常只会只会上图所示&#xff0c;大部分时候&#xff0c;用户只需要知道Division by zero就够了。 1、首先先建一个类BaseException并继承Exception&#xff0c;这里有三个参数 $code 400; $msg ; $errorCode ;并处理当抛出异常时的…

接口测试(java+testng+ant+jenkins)第三篇ant

1、ant是什么&#xff1f; 是一个将软件编译、测试、部署等步骤联系在一起加以自动化的一个工具 2、下载安装 http://www.cnblogs.com/yuzhongwusan/archive/2013/03/26/2982411.html 3、在eclipce中的使用 准备工作&#xff1a; 项目右键——new——folder——folder name: li…

KVM虚拟机IO处理过程(二) ----QEMU/KVM I/O 处理过程

接着KVM虚拟机IO处理过程中Guest Vm IO处理过程(http://blog.csdn.net/dashulu/article/details/16820281),本篇文章主要描述IO从guest vm跳转到kvm和qemu后的处理过程. 首先回顾一下kvm的启动过程(http://blog.csdn.net/dashulu/article/details/17074675).qemu通过调用kvm提供…

java FileI(O)nputStream为什么比BufferedI(O)utputStream慢?

因为buffered多了一个缓冲区&#xff0c;读和写都是先把硬盘或者内存中的数据放到内存中一块缓存区域&#xff0c;到一定大小读写到硬盘或者内存 package io; import java.io.*; public class FileIOTest { /** * param args * throws FileNotFoundException */…

如何利用echarts图表获取条状图点击名称和值

如何利用echarts图表获取条状图点击名称和值 听语音 |浏览&#xff1a;1505|更新&#xff1a;2017-06-13 10:20|标签&#xff1a;软件 1 2 3 4 5 6 7 分步阅读 echarts图表插件工具&#xff0c;包含了各种不同类型的图形&#xff0c;有圆饼图、折线图、圆环图、柱状图…

TP5: 日志记录改造——4

TP5的日志如果没有特别设置的话&#xff0c;只要出现错误就会记录在日志文件中。这种是没有做必要的&#xff0c;因为这样的话&#xff0c;LOG文件会特别大&#xff0c;而且有好多都是没有用的信息。下面我们对LOG日志进行改造只记录我们需要的信息。 还记得上一章中&#xff…

.NET使用免费开源类库操作Excel

2019独角兽企业重金招聘Python工程师标准>>> 自从上次找到NPOI之后&#xff0c;根据园友提供的线索以及Google&#xff0c;又找到了一些开源免费的类库&#xff0c;所以都简单体验了一遍。 主要找到以下类库&#xff1a; MyXls(http://sourceforge.net/projects/m…

信管网

https://www.cnitpm.com/