java aes_cbc_256 加密解密
在之前我们在openssl上和ios上分别测试了 AES256位cbc模式的加密和解密
今天用java提供的api来测试一下;进而确定一下在PC,iOS,安卓上三个平台下的加密解密数据;
1. 首先通过查询资料了解到:
- java的jdk 不支持256位AES密钥,需要安装扩展包,以下会提到
- java 中默认不支持PKCS7 填充方式,支持PKCS5,经测试PKCS5和pkcs7没多大区别(在多平台数据互测上)
- java中如果非要指定PKCS7 需要借助 BouncyCastle(java用的密码学类库)
2. 关于安装 支持AES 256位密钥的扩展包
下载http://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html
下载之后得到 local_policy.jar ,US_export_policy.jar 两个jar包,把这两个jar包放到 jdk/lib/security 目录下
替换原来的两个jar包即可
3. 使用java api 进行 AES_cbc_256位密钥 PKCS5 填充方式的加密解密
如下封装
- private static final String ALGORITHM = "AES/CBC/PKCS5Padding";
- //加密
- public static byte[] AES_cbc_encrypt(byte[] srcData,byte[] key,byte[] iv)
- {
- SecretKeySpec keySpec = new SecretKeySpec(key, "AES");
- Cipher cipher = Cipher.getInstance(ALGORITHM);
- cipher.init(Cipher.ENCRYPT_MODE, keySpec, new IvParameterSpec(iv));
- byte[] encData = cipher.doFinal(srcData);
- return encData;
- }
- //解密
- public static byte[] AES_cbc_decrypt(byte[] encData,byte[] key,byte[] iv)
- {
- SecretKeySpec keySpec = new SecretKeySpec(key, "AES");
- Cipher cipher = Cipher.getInstance(ALGORITHM);
- cipher.init(Cipher.DECRYPT_MODE, keySpec, new IvParameterSpec(iv));
- byte[] decbbdt = cipher.doFinal(encData);
- return decbbdt;
- }
测试调用
- public static void main(String[] args) {
- byte[] key= new byte[32];
- byte[] iv = new byte[16];
- String srcStr = "This is java default pkcs5padding PKCS5 TEST";
- System.out.println(srcStr);
- //设置key 全8,iv,全1,这里测试用
- for (int i = 0; i <32; i++) {
- key[i] = 8;
- if (i < 16) {iv[i] = 1;}
- }
- byte[] encbt = AES_cbc_encrypt(srcStr.getBytes(),key,iv);
- byte[] decbt = AES_cbc_decrypt(encbt,key,iv);
- String decStr = new String(decbt);
- System.out.println(decStr);
- if(srcStr.equals(decStr))
- {
- System.out.println("TEST PASS");
- }else
- {
- System.out.println("TEST NO PASS");
- }
- }
输出:
- This is java default pkcs5padding PKCS5 TEST
- This is java default pkcs5padding PKCS5 TEST
- TEST PASS
总结:此处使用的是java提供的PKCS5填充方式,其实和PKCS7是一样的,所以在ios上使用pkcs7,安卓上使用pkcs5,只要key和iv保持一致,相互加解密是没有问题的
完整的代码如下
- import java.io.UnsupportedEncodingException;
- import java.security.InvalidAlgorithmParameterException;
- import java.security.InvalidKeyException;
- import java.security.NoSuchAlgorithmException;
- import java.security.NoSuchProviderException;
- import java.security.Security;
- import java.util.Base64;
- 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;
- public class TestPKCS5 {
- private static final String ALGORITHM = "AES/CBC/PKCS5Padding";
- //加密
- public static byte[] AES_cbc_encrypt(byte[] srcData,byte[] key,byte[] iv) throws NoSuchAlgorithmException, NoSuchProviderException, NoSuchPaddingException, InvalidKeyException, InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException, UnsupportedEncodingException
- {
- SecretKeySpec keySpec = new SecretKeySpec(key, "AES");
- Cipher cipher = Cipher.getInstance(ALGORITHM);
- cipher.init(Cipher.ENCRYPT_MODE, keySpec, new IvParameterSpec(iv));
- byte[] encData = cipher.doFinal(srcData);
- return encData;
- }
- //解密
- public static byte[] AES_cbc_decrypt(byte[] encData,byte[] key,byte[] iv) throws NoSuchAlgorithmException, NoSuchProviderException, NoSuchPaddingException, InvalidKeyException, InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException, UnsupportedEncodingException
- {
- SecretKeySpec keySpec = new SecretKeySpec(key, "AES");
- Cipher cipher = Cipher.getInstance(ALGORITHM);
- cipher.init(Cipher.DECRYPT_MODE, keySpec, new IvParameterSpec(iv));
- byte[] decbbdt = cipher.doFinal(encData);
- return decbbdt;
- }
- public static void main(String[] args) throws InvalidKeyException, NoSuchAlgorithmException, NoSuchProviderException, NoSuchPaddingException, InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException, UnsupportedEncodingException {
- byte[] key= new byte[32];
- byte[] iv = new byte[16];
- String srcStr = "This is java default pkcs5padding PKCS5 TEST";
- System.out.println(srcStr);
- //设置key 全8,iv,全1,这里测试用
- for (int i = 0; i <32; i++) {
- key[i] = 8;
- if (i < 16) {iv[i] = 1;}
- }
- byte[] encbt = AES_cbc_encrypt(srcStr.getBytes(),key,iv);
- byte[] decbt = AES_cbc_decrypt(encbt,key,iv);
- String decStr = new String(decbt);
- System.out.println(decStr);
- if(srcStr.equals(decStr))
- {
- System.out.println("TEST PASS");
- }else
- {
- System.out.println("TEST NO PASS");
- }
- }
- }
4. 使用 BouncyCastle库 进行 AES_cbc_256 指定PKCS7方式加密解密
需要先去 http://www.bouncycastle.org/latest_releases.html 下载 库,并且导入到工程中
如下封装
- //AES_256_cbc pkcs7
- private static final String ALGORITHM = "AES/CBC/PKCS7Padding";
- //加密
- public static byte[] AES_cbc_encrypt(byte[] srcData,byte[] key,byte[] iv)
- {
- SecretKeySpec keySpec = new SecretKeySpec(key, "AES");
- Security.addProvider(new BouncyCastleProvider());
- Cipher cipher = Cipher.getInstance(ALGORITHM,"BC");
- cipher.init(Cipher.ENCRYPT_MODE, keySpec, new IvParameterSpec(iv));
- byte[] encData = cipher.doFinal(srcData);
- return encData;
- }
- //解密
- public static byte[] AES_cbc_decrypt(byte[] encData,byte[] key,byte[] iv)
- {
- SecretKeySpec keySpec = new SecretKeySpec(key, "AES");
- Security.addProvider(new BouncyCastleProvider());
- Cipher cipher = Cipher.getInstance(ALGORITHM,"BC");
- cipher.init(Cipher.DECRYPT_MODE, keySpec, new IvParameterSpec(iv));
- byte[] decbbdt = cipher.doFinal(encData);
- return decbbdt;
- }
调用测试代码
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- byte[] key= new byte[32];
- byte[] iv = new byte[16];
- String srcStr = "This is java bcprovlib pkcs7padding PKCS7 TEST";
- System.out.println(srcStr);
- //设置key 全8,iv,全1,这里测试用
- for (int i = 0; i <32; i++) {
- key[i] = 8;
- if (i < 16) {iv[i] = 1;}
- }
- byte[] encbt = AES_cbc_encrypt(srcStr.getBytes(),key,iv);
- byte[] decbt = AES_cbc_decrypt(encbt,key,iv);
- String decStr = new String(decbt);
- System.out.println(decStr);
- if(srcStr.equals(decStr))
- {
- System.out.println("TEST PASS");
- }else
- {
- System.out.println("TEST NO PASS");
- }
- }
输出结果:
- This is java bcprovlib pkcs7padding PKCS7 TEST
- This is java bcprovlib pkcs7padding PKCS7 TEST
- TEST PASS
总结:此处使用BC库的方式指定PKCS7方式,这样就和ios pc保持一致了;不过使用上面第一种方式也是可行的
完整的代码如下
- import java.util.Base64;
- import java.io.UnsupportedEncodingException;
- import java.security.InvalidAlgorithmParameterException;
- import java.security.InvalidKeyException;
- import java.security.NoSuchAlgorithmException;
- import java.security.NoSuchProviderException;
- import java.security.Security;
- import java.util.Arrays;
- import javax.crypto.BadPaddingException;
- import javax.crypto.Cipher;
- import javax.crypto.IllegalBlockSizeException;
- import javax.crypto.KeyGenerator;
- import javax.crypto.NoSuchPaddingException;
- import javax.crypto.SecretKey;
- import javax.crypto.spec.IvParameterSpec;
- import javax.crypto.spec.SecretKeySpec;
- import org.bouncycastle.jce.provider.BouncyCastleProvider;
- public class TestAES {
- //AES_256_cbc pkcs7
- private static final String ALGORITHM = "AES/CBC/PKCS7Padding";
- //加密
- public static byte[] AES_cbc_encrypt(byte[] srcData,byte[] key,byte[] iv) throws NoSuchAlgorithmException, NoSuchProviderException, NoSuchPaddingException, InvalidKeyException, InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException, UnsupportedEncodingException
- {
- SecretKeySpec keySpec = new SecretKeySpec(key, "AES");
- Security.addProvider(new BouncyCastleProvider());
- Cipher cipher = Cipher.getInstance(ALGORITHM,"BC");
- cipher.init(Cipher.ENCRYPT_MODE, keySpec, new IvParameterSpec(iv));
- byte[] encData = cipher.doFinal(srcData);
- return encData;
- }
- //解密
- public static byte[] AES_cbc_decrypt(byte[] encData,byte[] key,byte[] iv) throws NoSuchAlgorithmException, NoSuchProviderException, NoSuchPaddingException, InvalidKeyException, InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException, UnsupportedEncodingException
- {
- SecretKeySpec keySpec = new SecretKeySpec(key, "AES");
- Security.addProvider(new BouncyCastleProvider());
- Cipher cipher = Cipher.getInstance(ALGORITHM,"BC");
- cipher.init(Cipher.DECRYPT_MODE, keySpec, new IvParameterSpec(iv));
- byte[] decbbdt = cipher.doFinal(encData);
- return decbbdt;
- }
- public static void main(String[] args) throws InvalidKeyException, NoSuchAlgorithmException, NoSuchProviderException, NoSuchPaddingException, InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException, UnsupportedEncodingException {
- // TODO Auto-generated method stub
- byte[] key= new byte[32];
- byte[] iv = new byte[16];
- String srcStr = "This is java bcprovlib pkcs7padding PKCS7 TEST";
- System.out.println(srcStr);
- //设置key 全8,iv,全1,这里测试用
- for (int i = 0; i <32; i++) {
- key[i] = 8;
- if (i < 16) {iv[i] = 1;}
- }
- byte[] encbt = AES_cbc_encrypt(srcStr.getBytes(),key,iv);
- byte[] decbt = AES_cbc_decrypt(encbt,key,iv);
- String decStr = new String(decbt);
- System.out.println(decStr);
- if(srcStr.equals(decStr))
- {
- System.out.println("TEST PASS");
- }else
- {
- System.out.println("TEST NO PASS");
- }
- }
- }
测试使用 jdk1.8
java aes_cbc_256 加密解密的更多相关文章
- C# 实现 JAVA AES加密解密[原创]
以下是网上普遍能收到的JAVA AES加密解密方法. 因为里面用到了KeyGenerator 和 SecureRandom,但是.NET 里面没有这2个类.无法使用安全随机数生成KEY. 我们在接收J ...
- C#与Java同步加密解密DES算法
在实际项目中,往往前端和后端使用不同的语言.比如使用C#开发客户端,使用Java开发服务器端.有时出于安全性考虑需要将字符加密传输后,由服务器解密获取.本文介绍一种采用DES算法的C#与Java同步加 ...
- 你真的了解字典(Dictionary)吗? C# Memory Cache 踩坑记录 .net 泛型 结构化CSS设计思维 WinForm POST上传与后台接收 高效实用的.NET开源项目 .net 笔试面试总结(3) .net 笔试面试总结(2) 依赖注入 C# RSA 加密 C#与Java AES 加密解密
你真的了解字典(Dictionary)吗? 从一道亲身经历的面试题说起 半年前,我参加我现在所在公司的面试,面试官给了一道题,说有一个Y形的链表,知道起始节点,找出交叉节点.为了便于描述,我把上面 ...
- 【转】 java RSA加密解密实现
[转] java RSA加密解密实现 该工具类中用到了BASE64,需要借助第三方类库:javabase64-1.3.1.jar 下载地址:http://download.csdn.net/detai ...
- java字符串加密解密
java字符串加密解密 字符串加密解密的方式很多,每一种加密有着相对的解密方法.下面要说的是java中模拟php的pack和unpack的字符串加密解密方法. java模拟php中pack: /** ...
- C# Java 3DES加密解密 扩展及修正\0 问题
注: C#已亲测及做扩展, Java 部分未做验证 /// <summary> /// 3DES加密解密 /// ------------------------------------- ...
- Java Base64 加密解密
使用JDK的类 BASE64Decoder BASE64Encoder package test; import sun.misc.BASE64Decoder; import sun.misc.BA ...
- C# Java DES加密解密
转自http://www.cnblogs.com/zhuiyi/archive/2013/04/01/2993201.html 最近被DES加解密弄得超级郁闷,我用C#的方法加密得到的密文老是跟客户给 ...
- password学3——Java BASE64加密解密
Base64是网络上最常见的用于传输8Bit字节代码的编码方式之中的一个,大家能够查看RFC2045-RFC2049.上面有MIME的具体规范.Base64编码可用于在HTTP环境下传递较长的标识信息 ...
随机推荐
- 夺命雷公狗-----React_native---4---初始化项目
我们首先在android目录下创建一个apps的文件夹: 然后我们在apps目录下,按住shift键加鼠标右键选择--在此打开命令窗口输入命令初始化项目 然后就是等了................. ...
- 模拟apache commons dbutils 实现自己的BeanListHandler(回调应用)
首先dbcp相关的jar包和MySQL的驱动包导入到项目中. dbcp.properties配置文件如下,并放到项目根目录下. driverClassName=com.mysql.jdbc.Drive ...
- PHP基础班初学感悟
不知不觉差不多一个月就过去了 刚到培训班那时候的心情,现在也还能有所感觉 作为今年6月份的毕业生,刚从大学的实习期出来,辞掉了上一份工作,本来是打算找一份更加与专业挂钩的工作做的 也许是90后对网络的 ...
- 在ie与火狐的兼容性
1.在火狐下 document.getElementById("id").textContent可以获取当前获取id下的内容 而在ie下则为:document.getElem ...
- 01.线性表 ArrayList
public class MyArrayList { //容量 ; //存放数组元素 private object[] _items; //数组大小 private int _size; //元素个数 ...
- [转]MySQL innodb buffer pool
最近在对公司的 MySQL 服务器做性能优化, 一直对 innodb 的内存使用方式不是很清楚, 乘这机会做点总结. 在配置 MySQL 的时候, 一般都会需要设置 innodb_buffer_poo ...
- Codeforces 747D:Winter Is Coming(贪心)
http://codeforces.com/problemset/problem/747/D 题意:有n天,k次使用冬天轮胎的机会,无限次使用夏天轮胎的机会,如果t<=0必须使用冬轮,其他随意. ...
- Codefroces 750D:New Year and Fireworks(BFS)
http://codeforces.com/contest/750/problem/D 题意:烟花会绽放n次,每次会向前推进t[i]格,每次绽放会向左右45°绽放,问有烟花的格子数. 思路:n = 3 ...
- [linux系统]--常用命令
1.shell实现找到当前目录以及子目录中名字包含king的文件 find ./ | grep king 2.tcpdump抓包参数 -nne分别代表什么意思 -nn:直接以 IP 及 port nu ...
- LabVIEW如何调用C#Winform
界面交互并不是Labview的强项,使用Labview创建UI时候总会受制于VI有限的控件,有限的皮肤和有限的控件事件.而当需要实现UI的多文档的窗口,窗口的浮动停靠,动画等功能时还需要花很大的功夫. ...