在之前我们在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. caffe学习笔记(一),ubuntu14.04+GPU (用Pascal VOC2007训练数据,并测试)

    把源代码跑起来了,将实验过程记录如下,用于新手入门. 今天和师兄师姐才跑通,来分享下心得.(预训练网络:ImageNet_model,训练集:PASCAL VOC2007, GPU) 首先,整个tra ...

  2. msql,触发器无事物回滚,插入之前满足条件再插入

    很少写mysql的触发器和存储过程,由于需要需要做一个很小的判断,要用到触发器,要达到的效果就是,插入之前判断是否满足条件如果不满足就不插入 如果用sqlserver 或者orcale 就很简单,按s ...

  3. 【原创】我所理解的自动更新-APP发布与后台发布

    发布后台 创建渠道:添加新的渠道,设置渠道名称,自动生成渠道id.    查看渠道:查看渠道基本信息,渠道app版本号,资源版本号,是否开启更新.    创建/更新APP:选择打包ios,androi ...

  4. CSS3样式

    1.边框 div{border:2px solid;border-radius:25px;-moz-border-radius:25px; /* Old Firefox */} border-radi ...

  5. hdu 5901 Count primes

    题意: 计数区间$[1, n](1 \leq n \leq 10^{11})$素数个数. 分析: 这里只介绍一种动态规划的做法. 首先要说一下[分层思想]在动态规划中非常重要,下面的做法也正是基于这一 ...

  6. 还是this的问题

    var name = "The Window";    var object = {    name : "My Object",    getNameFunc ...

  7. [Spark] Spark的RDD编程

    本篇博客中的操作都在 ./bin/pyspark 中执行. RDD,即弹性分布式数据集(Resilient Distributed Dataset),是Spark对数据的核心抽象.RDD是分布式元素的 ...

  8. 使用 Laravel 前的准备工作

    是的,使用 Laravel 前需要准备开发环境,准备工作做完后,就可以一门心思的投入到学习 Laravel 知识的战斗中去了. Larvavel 是一个 PHP 框架,API 非常语义化.它激进,使用 ...

  9. python 学习笔记十二 CSS基础(进阶篇)

    1.CSS 简介 CSS 指层叠样式表 (Cascading Style Sheets) 样式定义如何显示 HTML 元素 样式通常存储在样式表中 把样式添加到 HTML 4.0 中,是为了解决内容与 ...

  10. laravel的学习感受

    学习laravel也有一段时间了自己感觉还是不怎么难就是自己的代码不熟悉所以很多的不怎么会.