在之前我们在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 加密解密的更多相关文章

  1. C# 实现 JAVA AES加密解密[原创]

    以下是网上普遍能收到的JAVA AES加密解密方法. 因为里面用到了KeyGenerator 和 SecureRandom,但是.NET 里面没有这2个类.无法使用安全随机数生成KEY. 我们在接收J ...

  2. C#与Java同步加密解密DES算法

    在实际项目中,往往前端和后端使用不同的语言.比如使用C#开发客户端,使用Java开发服务器端.有时出于安全性考虑需要将字符加密传输后,由服务器解密获取.本文介绍一种采用DES算法的C#与Java同步加 ...

  3. 你真的了解字典(Dictionary)吗? C# Memory Cache 踩坑记录 .net 泛型 结构化CSS设计思维 WinForm POST上传与后台接收 高效实用的.NET开源项目 .net 笔试面试总结(3) .net 笔试面试总结(2) 依赖注入 C# RSA 加密 C#与Java AES 加密解密

    你真的了解字典(Dictionary)吗?   从一道亲身经历的面试题说起 半年前,我参加我现在所在公司的面试,面试官给了一道题,说有一个Y形的链表,知道起始节点,找出交叉节点.为了便于描述,我把上面 ...

  4. 【转】 java RSA加密解密实现

    [转] java RSA加密解密实现 该工具类中用到了BASE64,需要借助第三方类库:javabase64-1.3.1.jar 下载地址:http://download.csdn.net/detai ...

  5. java字符串加密解密

    java字符串加密解密 字符串加密解密的方式很多,每一种加密有着相对的解密方法.下面要说的是java中模拟php的pack和unpack的字符串加密解密方法. java模拟php中pack: /** ...

  6. C# Java 3DES加密解密 扩展及修正\0 问题

    注: C#已亲测及做扩展, Java 部分未做验证 /// <summary> /// 3DES加密解密 /// ------------------------------------- ...

  7. Java Base64 加密解密

    使用JDK的类 BASE64Decoder  BASE64Encoder package test; import sun.misc.BASE64Decoder; import sun.misc.BA ...

  8. C# Java DES加密解密

    转自http://www.cnblogs.com/zhuiyi/archive/2013/04/01/2993201.html 最近被DES加解密弄得超级郁闷,我用C#的方法加密得到的密文老是跟客户给 ...

  9. password学3——Java BASE64加密解密

    Base64是网络上最常见的用于传输8Bit字节代码的编码方式之中的一个,大家能够查看RFC2045-RFC2049.上面有MIME的具体规范.Base64编码可用于在HTTP环境下传递较长的标识信息 ...

随机推荐

  1. hadoop 多表join:Map side join及Reduce side join范例

    最近在准备抽取数据的工作.有一个id集合200多M,要从另一个500GB的数据集合中抽取出所有id集合中包含的数据集.id数据集合中每一个行就是一个id的字符串(Reduce side join要在每 ...

  2. MVC3 数据验证用法之密码验证设计思路

    描述:MVC数据验证使用小结 内容:display,Required,stringLength,Remote,compare,RegularExpression 本人最近在公司用mvc做了一个修改密码 ...

  3. GUI生成exe文件

    gui如何生成exe文件: 已经有gui.m和gui.fig文件 1 安装编译器.已经安装好了vs10的. 2 设置编译器.在matlab命令行输入mex -setup,选择安装的c编译器 3 调用编 ...

  4. redhat6.3下源码编译方式安装最新版git

    在linux下安装git,通过yum方式安装的不是最新版本. 要替换最新版需要以下操作. 1.安装依赖包 # yum install curl-devel expat-devel gettext-de ...

  5. JVM基础知识

    JVM简介 JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的.J ...

  6. markdown-js 添加表格,代码块 parse

    简介 markdown-js 是将 markdown转换成 HTML 的 JavaScript 库,我再网站中使用它来预览 markdown ,但是发现它对 代码块 和 表格 是不转换的.这么鸡肋的地 ...

  7. JS—实现拖拽

    JS中的拖拽示例:    1)实现拖拽思路:当鼠标按下和拖拽过程中,鼠标与拖拽物体之间的相对距离保持不变    2)实现拖拽遇到的问题:        问题1:当鼠标按下移动过快时,离开了拖拽的物体时 ...

  8. js实现控制日期月份增减

    定义一个当前日期变量 var myDate = new Date(); 处理月份添加函数(date当前日期,num增加的月份[正数:增加月份,负数:减少月份])function addMonth(da ...

  9. [原创]WKWebview点击图片查看大图

    大家都知道,WKWebview是没有查看大图的属性或者方法的,所以只能通过js与之交互来实现这一功能,原理:通过js获取页面的图片,把它存放到数组,给图片添加点击事件,通过index显示大图就行了 其 ...

  10. Hibernate之环境搭建及demo

    ORM概念 ORM即Object/Relation Mapping, 对象/关系数据库映射.ORM是一种规范,完成面向对象编程语言到关系数据库之间的映射.J2EE中的JPA就是一种ORM规范. ORM ...