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
AES加密工具网址:http://tool.chacuo.net/cryptaes
16进制与字符串互转:http://www.bejson.com/convert/ox2str/
代码如下:
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 }
java实现AES/CBC/pack5padding加解密算法的更多相关文章
- Java 使用AES/CBC/PKCS7Padding 加解密字符串
介于java 不支持PKCS7Padding,只支持PKCS5Padding 但是PKCS7Padding 和 PKCS5Padding 没有什么区别要实现在java端用PKCS7Padding填充, ...
- C++ 和 java 使用 AES CBC 128 加解密
Java 使用jce, code: import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; import javax ...
- JAVA实现AES的加密和解密算法
原文 JAVA实现AES的加密和解密算法 import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; import ja ...
- JAVA AES CBC PKCS5Padding加解密
package com.hzxc.groupactivity.util; /** * Created by hdwang on 2019/1/17. */ import org.slf4j.Logge ...
- AES CBC/CTR 加解密原理
So, lets look at how CBC works first. The following picture shows the encryption when using CBC (in ...
- eclipse JAVA实现AES的加密和解密算法
import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.Secre ...
- openssl:AES CBC PKCS5 加解密 (C/GOLANG)
#include <openssl/aes.h> /* AES_CBC_PKCS5_Encrypt * 入参: * src:明文 * srcLen:明文长度 * key:密钥 长度只能是1 ...
- python 实现 AES CBC模式加解密
AES加密方式有五种:ECB, CBC, CTR, CFB, OFB 从安全性角度推荐CBC加密方法,本文介绍了CBC,ECB两种加密方法的python实现 python 在 Windows下使用AE ...
- java/php DES/CBC/PKCS5Padding加密解密算法实现过程
先看java代码 public static String encrypt(String message, String key) throws Exception { Cipher cipher = ...
- 手机号的 AES/CBC/PKCS7Padding 加解密
前言:接口中上次的手机号码和密码是传入的加密的,模拟自动化的时候也需要先对数据进行加密 1.各种语言实现 网上已经各种语言实现好的AES加密,可以点击查看:http://outofmemory.cn/ ...
随机推荐
- top单核与32C--CPU爆表
linux的cpu使用频率是根据cpu个数和核数决定的 top, 然后你按一下键盘的1,这就是单个核心的负载,不然是所有核心的负载相加,自然会超过100 单核为100%,服务器是32核的,下面基本用了 ...
- idea的小tip
1. 校验正则表达式 String类型的matches方法中键入option+return选择 check regexp可以测试正则的正确性
- Unity 在2D中实现LookAt,跟随鼠标转动
Vector3 v = (target.position - transform.position).normalized; transform.right = v;
- MySQL表操作(下篇)--完整性约束
一.介绍 约束条件与数据类型的宽度一样,都是可选参数 作用:用于保证数据的完整性和一致性主要分为: PRIMARY KEY (PK) 标识该字段为该表的主键,可以唯一的标识记录FOREIGN KEY ...
- csec的key更新
在对csec的使用中(其他遵循hsm key update协议的芯片也适用),kdf的运算过程中遇到的数据都是128bit.不需要考虑padding的问题.目前并没有找到对padding的一致性的处理 ...
- j2ee目录索引
j2ee 不完全目录 Eclipse中配置约束(DTD,XSD) Eclipse 快捷键 及其 xsd dtd配置本地约束 ===================================== ...
- pip修改镜像源
# 单独一次下载软件 pip install markdown -i https://pypi.tuna.tsinghua.edu.cn/simple # 全局修改 pip config set gl ...
- Mac下Virtual Box 6.1 Host-Only 网络配置 没有虚拟网卡
Virtual Box 6.1 mac下 Virtual Box Host-Only 没有 vboxnet0 点击 tools -> 右边的三杆,点 Network 可以添加,修改,删除 虚拟 ...
- eclipse (4.10.0)安装sts
1.离线安装 下载对应版本 https://spring.io/tools3/sts/all 打开Eclipse,点击help下的install new software,选择Add..,再点击Arc ...
- javascript【应用】debounce和throttle
debounce防抖 在事件被触发n秒后再执行回调,如果在这n秒内又被触发,则重新计时:典型的案例就是输入搜索:输入结束后n秒才进行搜索请求,n秒内又输入的内容,就重新计时. <div id=& ...