在之前我们在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 填充方式的加密解密

如下封装

  1. private static final String ALGORITHM = "AES/CBC/PKCS5Padding";
  2. //加密
  3. public static byte[] AES_cbc_encrypt(byte[] srcData,byte[] key,byte[] iv)
  4. {
  5. SecretKeySpec keySpec = new SecretKeySpec(key, "AES");
  6. Cipher cipher = Cipher.getInstance(ALGORITHM);
  7. cipher.init(Cipher.ENCRYPT_MODE, keySpec, new IvParameterSpec(iv));
  8. byte[] encData = cipher.doFinal(srcData);
  9. return encData;
  10. }
  11.  
  12. //解密
  13. public static byte[] AES_cbc_decrypt(byte[] encData,byte[] key,byte[] iv)
  14. {
  15. SecretKeySpec keySpec = new SecretKeySpec(key, "AES");
  16. Cipher cipher = Cipher.getInstance(ALGORITHM);
  17. cipher.init(Cipher.DECRYPT_MODE, keySpec, new IvParameterSpec(iv));
  18. byte[] decbbdt = cipher.doFinal(encData);
  19. return decbbdt;
  20. }

测试调用

  1. public static void main(String[] args) {
  2.  
  3. byte[] key= new byte[32];
  4. byte[] iv = new byte[16];
  5.  
  6. String srcStr = "This is java default pkcs5padding PKCS5 TEST";
  7. System.out.println(srcStr);
  8.  
  9. //设置key 全8,iv,全1,这里测试用
  10. for (int i = 0; i <32; i++) {
  11. key[i] = 8;
  12. if (i < 16) {iv[i] = 1;}
  13. }
  14.  
  15. byte[] encbt = AES_cbc_encrypt(srcStr.getBytes(),key,iv);
  16. byte[] decbt = AES_cbc_decrypt(encbt,key,iv);
  17. String decStr = new String(decbt);
  18. System.out.println(decStr);
  19.  
  20. if(srcStr.equals(decStr))
  21. {
  22. System.out.println("TEST PASS");
  23. }else
  24. {
  25. System.out.println("TEST NO PASS");
  26. }
  27.  
  28. }

输出:

  1. This is java default pkcs5padding PKCS5 TEST
  2. This is java default pkcs5padding PKCS5 TEST
  3. TEST PASS

总结:此处使用的是java提供的PKCS5填充方式,其实和PKCS7是一样的,所以在ios上使用pkcs7,安卓上使用pkcs5,只要key和iv保持一致,相互加解密是没有问题的

完整的代码如下

  1. import java.io.UnsupportedEncodingException;
  2. import java.security.InvalidAlgorithmParameterException;
  3. import java.security.InvalidKeyException;
  4. import java.security.NoSuchAlgorithmException;
  5. import java.security.NoSuchProviderException;
  6. import java.security.Security;
  7. import java.util.Base64;
  8.  
  9. import javax.crypto.BadPaddingException;
  10. import javax.crypto.Cipher;
  11. import javax.crypto.IllegalBlockSizeException;
  12. import javax.crypto.NoSuchPaddingException;
  13. import javax.crypto.spec.IvParameterSpec;
  14. import javax.crypto.spec.SecretKeySpec;
  15.  
  16. public class TestPKCS5 {
  17.  
  18. private static final String ALGORITHM = "AES/CBC/PKCS5Padding";
  19. //加密
  20. public static byte[] AES_cbc_encrypt(byte[] srcData,byte[] key,byte[] iv) throws NoSuchAlgorithmException, NoSuchProviderException, NoSuchPaddingException, InvalidKeyException, InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException, UnsupportedEncodingException
  21. {
  22. SecretKeySpec keySpec = new SecretKeySpec(key, "AES");
  23. Cipher cipher = Cipher.getInstance(ALGORITHM);
  24. cipher.init(Cipher.ENCRYPT_MODE, keySpec, new IvParameterSpec(iv));
  25. byte[] encData = cipher.doFinal(srcData);
  26. return encData;
  27. }
  28.  
  29. //解密
  30. public static byte[] AES_cbc_decrypt(byte[] encData,byte[] key,byte[] iv) throws NoSuchAlgorithmException, NoSuchProviderException, NoSuchPaddingException, InvalidKeyException, InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException, UnsupportedEncodingException
  31. {
  32. SecretKeySpec keySpec = new SecretKeySpec(key, "AES");
  33. Cipher cipher = Cipher.getInstance(ALGORITHM);
  34. cipher.init(Cipher.DECRYPT_MODE, keySpec, new IvParameterSpec(iv));
  35. byte[] decbbdt = cipher.doFinal(encData);
  36. return decbbdt;
  37. }
  38.  
  39. public static void main(String[] args) throws InvalidKeyException, NoSuchAlgorithmException, NoSuchProviderException, NoSuchPaddingException, InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException, UnsupportedEncodingException {
  40.  
  41. byte[] key= new byte[32];
  42. byte[] iv = new byte[16];
  43.  
  44. String srcStr = "This is java default pkcs5padding PKCS5 TEST";
  45. System.out.println(srcStr);
  46.  
  47. //设置key 全8,iv,全1,这里测试用
  48. for (int i = 0; i <32; i++) {
  49. key[i] = 8;
  50. if (i < 16) {iv[i] = 1;}
  51. }
  52.  
  53. byte[] encbt = AES_cbc_encrypt(srcStr.getBytes(),key,iv);
  54. byte[] decbt = AES_cbc_decrypt(encbt,key,iv);
  55. String decStr = new String(decbt);
  56. System.out.println(decStr);
  57.  
  58. if(srcStr.equals(decStr))
  59. {
  60. System.out.println("TEST PASS");
  61. }else
  62. {
  63. System.out.println("TEST NO PASS");
  64. }
  65.  
  66. }
  67.  
  68. }

  

4.  使用 BouncyCastle库 进行 AES_cbc_256 指定PKCS7方式加密解密

需要先去 http://www.bouncycastle.org/latest_releases.html 下载 库,并且导入到工程中

如下封装

  1. //AES_256_cbc pkcs7
  2. private static final String ALGORITHM = "AES/CBC/PKCS7Padding";
  3.  
  4. //加密
  5. public static byte[] AES_cbc_encrypt(byte[] srcData,byte[] key,byte[] iv)
  6. {
  7. SecretKeySpec keySpec = new SecretKeySpec(key, "AES");
  8. Security.addProvider(new BouncyCastleProvider());
  9. Cipher cipher = Cipher.getInstance(ALGORITHM,"BC");
  10. cipher.init(Cipher.ENCRYPT_MODE, keySpec, new IvParameterSpec(iv));
  11. byte[] encData = cipher.doFinal(srcData);
  12. return encData;
  13. }
  14.  
  15. //解密
  16. public static byte[] AES_cbc_decrypt(byte[] encData,byte[] key,byte[] iv)
  17. {
  18. SecretKeySpec keySpec = new SecretKeySpec(key, "AES");
  19. Security.addProvider(new BouncyCastleProvider());
  20. Cipher cipher = Cipher.getInstance(ALGORITHM,"BC");
  21. cipher.init(Cipher.DECRYPT_MODE, keySpec, new IvParameterSpec(iv));
  22. byte[] decbbdt = cipher.doFinal(encData);
  23. return decbbdt;
  24. }

  调用测试代码

  1. public static void main(String[] args) {
  2. // TODO Auto-generated method stub
  3.  
  4. byte[] key= new byte[32];
  5. byte[] iv = new byte[16];
  6.  
  7. String srcStr = "This is java bcprovlib pkcs7padding PKCS7 TEST";
  8. System.out.println(srcStr);
  9.  
  10. //设置key 全8,iv,全1,这里测试用
  11. for (int i = 0; i <32; i++) {
  12. key[i] = 8;
  13. if (i < 16) {iv[i] = 1;}
  14. }
  15.  
  16. byte[] encbt = AES_cbc_encrypt(srcStr.getBytes(),key,iv);
  17. byte[] decbt = AES_cbc_decrypt(encbt,key,iv);
  18. String decStr = new String(decbt);
  19. System.out.println(decStr);
  20.  
  21. if(srcStr.equals(decStr))
  22. {
  23. System.out.println("TEST PASS");
  24. }else
  25. {
  26. System.out.println("TEST NO PASS");
  27. }
  28.  
  29. }

  输出结果:

  1. This is java bcprovlib pkcs7padding PKCS7 TEST
  2. This is java bcprovlib pkcs7padding PKCS7 TEST
  3. TEST PASS

总结:此处使用BC库的方式指定PKCS7方式,这样就和ios pc保持一致了;不过使用上面第一种方式也是可行的

完整的代码如下

  1. import java.util.Base64;
  2. import java.io.UnsupportedEncodingException;
  3. import java.security.InvalidAlgorithmParameterException;
  4. import java.security.InvalidKeyException;
  5. import java.security.NoSuchAlgorithmException;
  6. import java.security.NoSuchProviderException;
  7. import java.security.Security;
  8. import java.util.Arrays;
  9.  
  10. import javax.crypto.BadPaddingException;
  11. import javax.crypto.Cipher;
  12. import javax.crypto.IllegalBlockSizeException;
  13. import javax.crypto.KeyGenerator;
  14. import javax.crypto.NoSuchPaddingException;
  15. import javax.crypto.SecretKey;
  16. import javax.crypto.spec.IvParameterSpec;
  17. import javax.crypto.spec.SecretKeySpec;
  18. import org.bouncycastle.jce.provider.BouncyCastleProvider;
  19.  
  20. public class TestAES {
  21.  
  22. //AES_256_cbc pkcs7
  23. private static final String ALGORITHM = "AES/CBC/PKCS7Padding";
  24.  
  25. //加密
  26. public static byte[] AES_cbc_encrypt(byte[] srcData,byte[] key,byte[] iv) throws NoSuchAlgorithmException, NoSuchProviderException, NoSuchPaddingException, InvalidKeyException, InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException, UnsupportedEncodingException
  27. {
  28. SecretKeySpec keySpec = new SecretKeySpec(key, "AES");
  29. Security.addProvider(new BouncyCastleProvider());
  30. Cipher cipher = Cipher.getInstance(ALGORITHM,"BC");
  31. cipher.init(Cipher.ENCRYPT_MODE, keySpec, new IvParameterSpec(iv));
  32. byte[] encData = cipher.doFinal(srcData);
  33. return encData;
  34. }
  35.  
  36. //解密
  37. public static byte[] AES_cbc_decrypt(byte[] encData,byte[] key,byte[] iv) throws NoSuchAlgorithmException, NoSuchProviderException, NoSuchPaddingException, InvalidKeyException, InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException, UnsupportedEncodingException
  38. {
  39. SecretKeySpec keySpec = new SecretKeySpec(key, "AES");
  40. Security.addProvider(new BouncyCastleProvider());
  41. Cipher cipher = Cipher.getInstance(ALGORITHM,"BC");
  42. cipher.init(Cipher.DECRYPT_MODE, keySpec, new IvParameterSpec(iv));
  43. byte[] decbbdt = cipher.doFinal(encData);
  44. return decbbdt;
  45. }
  46.  
  47. public static void main(String[] args) throws InvalidKeyException, NoSuchAlgorithmException, NoSuchProviderException, NoSuchPaddingException, InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException, UnsupportedEncodingException {
  48. // TODO Auto-generated method stub
  49.  
  50. byte[] key= new byte[32];
  51. byte[] iv = new byte[16];
  52.  
  53. String srcStr = "This is java bcprovlib pkcs7padding PKCS7 TEST";
  54. System.out.println(srcStr);
  55.  
  56. //设置key 全8,iv,全1,这里测试用
  57. for (int i = 0; i <32; i++) {
  58. key[i] = 8;
  59. if (i < 16) {iv[i] = 1;}
  60. }
  61.  
  62. byte[] encbt = AES_cbc_encrypt(srcStr.getBytes(),key,iv);
  63. byte[] decbt = AES_cbc_decrypt(encbt,key,iv);
  64. String decStr = new String(decbt);
  65. System.out.println(decStr);
  66.  
  67. if(srcStr.equals(decStr))
  68. {
  69. System.out.println("TEST PASS");
  70. }else
  71. {
  72. System.out.println("TEST NO PASS");
  73. }
  74.  
  75. }
  76.  
  77. }

  

测试使用 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. 夺命雷公狗-----React_native---4---初始化项目

    我们首先在android目录下创建一个apps的文件夹: 然后我们在apps目录下,按住shift键加鼠标右键选择--在此打开命令窗口输入命令初始化项目 然后就是等了................. ...

  2. 模拟apache commons dbutils 实现自己的BeanListHandler(回调应用)

    首先dbcp相关的jar包和MySQL的驱动包导入到项目中. dbcp.properties配置文件如下,并放到项目根目录下. driverClassName=com.mysql.jdbc.Drive ...

  3. PHP基础班初学感悟

    不知不觉差不多一个月就过去了 刚到培训班那时候的心情,现在也还能有所感觉 作为今年6月份的毕业生,刚从大学的实习期出来,辞掉了上一份工作,本来是打算找一份更加与专业挂钩的工作做的 也许是90后对网络的 ...

  4. 在ie与火狐的兼容性

    1.在火狐下  document.getElementById("id").textContent可以获取当前获取id下的内容   而在ie下则为:document.getElem ...

  5. 01.线性表 ArrayList

    public class MyArrayList { //容量 ; //存放数组元素 private object[] _items; //数组大小 private int _size; //元素个数 ...

  6. [转]MySQL innodb buffer pool

    最近在对公司的 MySQL 服务器做性能优化, 一直对 innodb 的内存使用方式不是很清楚, 乘这机会做点总结. 在配置 MySQL 的时候, 一般都会需要设置 innodb_buffer_poo ...

  7. Codeforces 747D:Winter Is Coming(贪心)

    http://codeforces.com/problemset/problem/747/D 题意:有n天,k次使用冬天轮胎的机会,无限次使用夏天轮胎的机会,如果t<=0必须使用冬轮,其他随意. ...

  8. Codefroces 750D:New Year and Fireworks(BFS)

    http://codeforces.com/contest/750/problem/D 题意:烟花会绽放n次,每次会向前推进t[i]格,每次绽放会向左右45°绽放,问有烟花的格子数. 思路:n = 3 ...

  9. [linux系统]--常用命令

    1.shell实现找到当前目录以及子目录中名字包含king的文件 find ./ | grep king 2.tcpdump抓包参数 -nne分别代表什么意思 -nn:直接以 IP 及 port nu ...

  10. LabVIEW如何调用C#Winform

    界面交互并不是Labview的强项,使用Labview创建UI时候总会受制于VI有限的控件,有限的皮肤和有限的控件事件.而当需要实现UI的多文档的窗口,窗口的浮动停靠,动画等功能时还需要花很大的功夫. ...