在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。还请各位如果有遇到相同情况的可以解答一下。

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

  1. JAVA——DES/ECB/PKCS7Padding加密算法[Cannot find any provider supporting DESEDE/CBC/PKCS7Padding]解决方案

    基本概念 DES算法:密码体制中的对称密码体制,又被称为美国数据加密标准,是1972年美国IBM公司研制的对称密码体制加密算法. 明文按64位进行分组,密钥长64位,密钥事实上是56位参与DES运算( ...

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

    关于"Cannot find any provider supporting AES/ECB/PKCS7Padding"问题的解决方案 参考文章: (1)关于"Canno ...

  3. java微信小程序解密AES/CBC/PKCS7Padding

    摘要:微信小程序解密建议使用1.6及以上的环境使用maven下载jar包org.bouncycastlebcprov-jdk15on1.55加密类代码importorg.bouncycastle.jc ...

  4. python aes padding_python笔记43-加解密AES/CBC/pkcs7padding

    前言 有些公司对接口的安全要求比较高,传参数的时候,不会明文的传输,先对接口加密,返回的数据也加密返回. 目前比较常见的加密方式是AES/CBC/pkcs7padding. AES五种加密模式 在AE ...

  5. java微信公众号开发token验证失败的问题及解决办法

    java微信公众号开发token验证失败的问题及解决办法 参考文章: (1)java微信公众号开发token验证失败的问题及解决办法 (2)https://www.cnblogs.com/beardu ...

  6. java不同的包下相同的类名的问题与解决办法

    java不同的包下相同的类名的问题与解决办法 参考文章: (1)java不同的包下相同的类名的问题与解决办法 (2)https://www.cnblogs.com/yanggb/p/10650256. ...

  7. keytool 错误: java.io.IOException: Keystore was tampered with, or password was incorrect → 解决办法

    keytool 错误: java.io.IOException: Keystore was tampered with, or password was incorrect → 解决办法 问题复现 我 ...

  8. Spring Boot整合Nacos时遇到 java.lang.IllegalStateException: Context has been already given a name 的解决办法

    问题概述 在进行项目开发过程中,通过Spring Boot整合Alibaba Nacos的服务注册与发现和配置中心时,遇到个梗,启动时打印出一串错误日志信息 " Failed to rena ...

  9. Java的poi导出的excel不能超过256列的解决办法

    Java的poi导出的excel不能超过256列的解决办法 背景 1.现在的情况 2.解决办法 背景 导出时如果列超过256导出就会报错,现在进行解决 1.现在的情况 excel文件名以.xls结尾 ...

最新文章

  1. 你还不了解基于session的授权认证吗?
  2. python中elif老是出错_python为什么会存在if执行了依然会执行elif的情况?
  3. 步步为营 .NET 设计模式学习笔记 十三、Bridge (桥接模式)
  4. 我敢打赌,99%的电子工程师都掉进过这29个坑!
  5. java重置radiobutton的选项_求助:这道题显示radiobutton男女的功能和重置功能怎么做...
  6. Docker入门-安装
  7. matlab 二值化_基于MATLAB的指纹识别系统[GUI界面+万字技术文档+语音播报]
  8. 点击MSFlexGrid数据控件的标题进行数据排序
  9. MAC中安装Navicat Premium
  10. java弹窗代码_JAVA的弹窗怎么做?
  11. 企业微信之发送应用消息案例
  12. easyui datagrid mysql分页_Easyui 自定义分页_EasyUI 教程
  13. 打开GitHub官网缓慢
  14. 谷歌浏览器被hao123绑定首页了
  15. 【MineCraft】-- 学习我的世界Mod制作引雷附魔书与事件
  16. 由点及面,一叶知秋——集合大家族
  17. win7计算机时间显示错误,win7系统时间怎么调总是不对如何解决?win7系统时间总是不对解决方法...
  18. 攻读学位研究计划计算机专业,拟攻读博士学位的科学研究计划书模板
  19. 西门子PLC中STL语言状态字
  20. 433~458(flex+携程网移动端首页)

热门文章

  1. python3 安装Crypto 出现的问题
  2. 237. 删除链表中的节点 golang
  3. 《C++ Primer第五版》习题答案
  4. C++ STL 三大组件(容器|算法|迭代器) 初步使用01
  5. 【Verilog HDL】深入理解部分语法规则的本质
  6. 1038. 统计同成绩学生(20)
  7. 实现技术3次作业 谢筱 1101220759
  8. Eclipse里的快捷键
  9. mysql Invalid use of group function的解决办法
  10. Java中获取完整的url