java实现AES/CBC/pack5padding加解密算法

最近要测试一个借口,借口的传值参数是使用AES加密,偏移量为0000000000000000,秘钥:12345678901234567890123456789012,加密后内容转成16进制发送,用网上的代码一直没实现,最后发送是因为jre的两个jar包需要升级,支持key大于16位。

两个jar包:US_export_policy.jar、local_policy.jar,下载地址:https://files.cnblogs.com/files/tech-test/security.zip

代码如下:

  1 package com.test;
  2 import javax.crypto.Cipher;
  3 import javax.crypto.spec.IvParameterSpec;
  4 import javax.crypto.spec.SecretKeySpec;
  5 import java.util.Base64.Encoder;
  6 import java.util.Base64;
  7 import java.util.Base64.Decoder;
  8
  9
 10 /**
 11  * AES/CBC/PKCS5Padding 对称加密
 12  * @author jia
 13  *
 14  */
 15 public class AEStest {
 16
 17      private static final String ALGORITHM = "AES/CBC/PKCS5Padding";
 18         /**
 19          * 数据加密
 20          * @param srcData
 21          * @param key
 22          * @param iv
 23          * @return
 24          */
 25         public static String encrypt(String srcData,byte[] key,byte[] iv)
 26         {
 27             SecretKeySpec keySpec = new SecretKeySpec(key, "AES");
 28             Cipher cipher;
 29             String encodeBase64String = null;
 30             try {
 31                 cipher = Cipher.getInstance(ALGORITHM);
 32                 cipher.init(Cipher.ENCRYPT_MODE, keySpec, new IvParameterSpec(iv));
 33                 byte[] encData = cipher.doFinal(srcData.getBytes());
 34                 encodeBase64String = Base64.getEncoder().encodeToString(encData);
 35                 //encodeBase64String = Base64.encodeBase64String(encData);
 36             } catch (Exception e) {
 37                 e.printStackTrace();
 38             }
 39             return encodeBase64String;
 40         }
 41
 42         /**
 43          * 数据解密
 44          * @param encDataStr
 45          * @param key
 46          * @param iv
 47          * @return
 48          */
 49         public static String decrypt(String encDataStr,byte[] key,byte[] iv)
 50         {
 51             byte[] encData = Base64.getDecoder().decode(encDataStr);
 52 //            byte[] encData = Base64.decodeBase64(encDataStr);
 53             SecretKeySpec keySpec = new SecretKeySpec(key, "AES");
 54             Cipher cipher;
 55             byte[] decbbdt = null;
 56             try {
 57                 cipher = Cipher.getInstance(ALGORITHM);
 58                 cipher.init(Cipher.DECRYPT_MODE, keySpec, new IvParameterSpec(iv));
 59                 decbbdt = cipher.doFinal(encData);
 60             } catch (Exception e) {
 61                 e.printStackTrace();
 62             }
 63             return new String(decbbdt);
 64         }
 65
 66
 67         public static String str2HexStr(String str) {
 68             char[] chars = "0123456789ABCDEF".toCharArray();
 69             StringBuilder sb = new StringBuilder("");
 70             byte[] bs = str.getBytes();
 71             int bit;
 72             for (int i = 0; i < bs.length; i++) {
 73                 bit = (bs[i] & 0x0f0) >> 4;
 74                 sb.append(chars[bit]);
 75                 bit = bs[i] & 0x0f;
 76                 sb.append(chars[bit]);
 77                 // sb.append(‘ ‘);
 78             }
 79             return sb.toString().trim();
 80         }
 81
 82         /**
 83          * 16进制直接转换成为字符串(无需Unicode解码)
 84          * @param hexStr
 85          * @return
 86          */
 87         public static String hexStr2Str(String hexStr) {
 88             String str = "0123456789ABCDEF";
 89             char[] hexs = hexStr.toCharArray();
 90             byte[] bytes = new byte[hexStr.length() / 2];
 91             int n;
 92             for (int i = 0; i < bytes.length; i++) {
 93                 n = str.indexOf(hexs[2 * i]) * 16;
 94                 n += str.indexOf(hexs[2 * i + 1]);
 95                 bytes[i] = (byte) (n & 0xff);
 96             }
 97             return new String(bytes);
 98         }
 99
100     public static void main(String[] args) throws Exception {
101         String str = "12345678901234567890123456789012";
102         byte[] s = str.getBytes();
103         String s2 = "12345678ilkljklkjv";
104
105
106         String iv = "0000000000000000";
107         System.out.println("加密前: "+s2);
108         String encrypt = AEStest.encrypt(s2, s, iv.getBytes());
109         System.out.println("加密后: "+new String(encrypt));
110         String hex = AEStest.str2HexStr(encrypt);
111         System.out.println("加密后转16进制: "+new String(hex));
112         String tohex = AEStest.hexStr2Str(hex);
113         System.out.println("16进制转加密后: "+new String(tohex));
114
115
116         String decrypt = AEStest.decrypt(tohex, s, iv.getBytes());
117         System.out.println("解密后: "+decrypt);
118     }
119 }

原文地址:https://www.cnblogs.com/tech-test/p/study_java.html

时间: 2024-08-01 10:09:48

java实现AES/CBC/pack5padding加解密算法的相关文章

Java 使用AES/CBC/PKCS7Padding 加解密字符串

介于java 不支持PKCS7Padding,只支持PKCS5Padding 但是PKCS7Padding 和 PKCS5Padding 没有什么区别要实现在java端用PKCS7Padding填充,需要用到bouncycastle组件来实现 所以需要一个jar 来支持.bcprov-jdk16-146.jar 下载地址:http://central.maven.org/maven2/org/bouncycastle/bcprov-jdk16/1.46/bcprov-jdk16-1.46.jar

JAVA实现AES的加密和解密算法

原文 JAVA实现AES的加密和解密算法 import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; import sun.misc.BASE64Decoder; import sun.misc.BASE64Encoder; /** * AES 是一种可逆加密算法,对用户的敏感信息加密处理 * 对原始数据进行AES加密后,在进行Base6

java/php DES/CBC/PKCS5Padding加密解密算法实现过程

先看java代码 Java代码   public static String encrypt(String message, String key) throws Exception { Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding"); DESKeySpec desKeySpec = new DESKeySpec(key.getBytes("UTF-8")); SecretKeyFactory k

AES CBC/CTR 加解密原理

So, lets look at how CBC works first. The following picture shows the encryption when using CBC (in this case, using AES as the cipher). Basically, Cipher-Block-Chaining means that previous to putting the cleartext data block into the cipher itself (

[掌眼]iOS / Android / java / node.js 通用的 AES256 加解密算法

example.m NSString *text = @"text"; NSString *key32 = @"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; NSData *data = [text dataUsingEncoding:NSUTF8StringEncoding]; NSString *encryptedData = [[data AES256EncryptWithKey:key32] base64EncodedStringWi

AES加解密算法Qt实现

[声明] (1) 本文源码 在一位未署名网友源码基础上,利用Qt编程,实现了AES加解密算法,并添加了文件加解密功能.在此表示感谢!该源码仅供学习交流,请勿用于商业目的. (2) 图片及描述 除图1外,图片及部分解析来自http://zh.wikipedia.org/wiki/%E9%AB%98%E7%BA%A7%E5%8A%A0%E5%AF%86%E6%A0%87%E5%87%86.图1为个人劳动成果,请勿盗用此图. [简介] AES(Advanced Encryption Standard,

DES加解密算法Qt实现

算法解密qt加密table64bit [声明] (1) 本文源码 大部分源码来自:DES算法代码.在此基础上,利用Qt编程进行了改写,实现了DES加解密算法,并添加了文件加解密功能.在此对署名为bengold1979的网友表示感谢!本文是对DES算法代码一文代码的具体描述.该源码仅供学习交流,请勿用于商业目的. (2) 图片及描述 图片及部分解析来自 http://zh.wikipedia.org/wiki/%E8%B3%87%E6%96%99%E5%8A%A0%E5%AF%86%E6%A8%9

【转】各种加解密算法比较

转自: http://blog.csdn.net/pengzp/article/details/6556674 二.          加密算法介绍 对称加密算法 对称加密算法用来对敏感数据等信息进行加密,常用的算法包括: DES(Data Encryption Standard):数据加密标准,速度较快,适用于加密大量数据的场合. 3DES(Triple DES):是基于DES,对一块数据用三个不同的密钥进行三次加密,强度更高. AES(Advanced Encryption Standard

加解密算法

加解密算法概述 工作中经常用到加解密算法大概有以下三种: 单项散列算法 对称散列算法 非对称散列算法 单项散列算法 由不定长的数据转化为固定长的字符串,代表有: sha1 sha1($str[,raw_out=false]);//算法不够复杂 raw_out默认为false,生成一个32位的加密串 如果为true,则生成一个16位的二进制流 md5 md5($str[,strict=false]) strict默认为false,生成一个32位的加密串 如果为true,则生成一个16位的二进制流