Java-AESUtil
在线版 http://tool.chacuo.net/cryptaes
要使用 AES/CBC/PKCS7Padding 模式需要添加依赖
<!--AES/CBC/PKCS7Padding-->
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk16</artifactId>
<version>1.46</version>
</dependency>
AES 工具类
// 加密算法
private static final String ENCRY_ALGORITHM = "AES";
// 加密算法/加密模式/填充类型
private static final String CIPHER_MODE = "AES/CBC/PKCS7Padding";
// 设置iv偏移量,ECB加密模式不需要设置 iv 偏移量
private static final String IV = "0000000000000000";
// 设置加密字符集
private static final String CHARACTER = "UTF-8";
// 加密密码长度。默认 16 byte * 8 = 128 bit
private static final int PWD_SIZE = 16; static {
// 添加 AES/CBC/PKCS7Padding 支持
Security.addProvider(new BouncyCastleProvider());
} public static void main(String[] args) {
String str = "NiHao";
byte[] encryptAES = encryptAES(str, "1234567899874563");
byte[] decryptAES = decryptAES(encryptAES, "1234567899874563");
System.out.println(new String(decryptAES));
} /**
* 密码长度不足补"0"
*/
private static byte[] pwdHandler(String password) throws UnsupportedEncodingException {
byte[] data = null;
if (password == null) {
password = "";
}
StringBuffer sb = new StringBuffer(PWD_SIZE);
sb.append(password);
while (sb.length() < PWD_SIZE) {
sb.append("0");
}
if (sb.length() > PWD_SIZE) {
sb.setLength(PWD_SIZE);
}
data = sb.toString().getBytes(CHARACTER);
return data;
} /**
* AES 加密
*
* @param cleartext 明文
* @param key 密钥
* @return
*/
public static byte[] encryptAES(String cleartext, String key) {
try {
// 获取加密密钥
SecretKeySpec keySpec = new SecretKeySpec(pwdHandler(key), ENCRY_ALGORITHM);
// 获取Cipher实例
Cipher cipher = Cipher.getInstance(CIPHER_MODE); // 查看数据块位数 默认为16(byte) * 8 =128 bit
// System.out.println("数据块位数(byte):" + cipher.getBlockSize()); // 初始化Cipher实例。设置执行模式以及加密密钥
cipher.init(Cipher.ENCRYPT_MODE, keySpec, new IvParameterSpec(IV.getBytes(CHARACTER)));
// 执行
byte[] cipherTextBytes = cipher.doFinal(cleartext.getBytes(CHARACTER));
return cipherTextBytes;
} catch (NoSuchPaddingException e) {
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (BadPaddingException e) {
e.printStackTrace();
} catch (IllegalBlockSizeException e) {
e.printStackTrace();
} catch (InvalidKeyException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
return null;
} /**
* AES 解密
*
* @param ciphertext 密文
* @param key 密钥
* @return
*/
public static byte[] decryptAES(byte[] ciphertext, String key) {
try {
// 获取解密密钥
SecretKeySpec keySpec = new SecretKeySpec(pwdHandler(key), ENCRY_ALGORITHM);
// 获取Cipher实例
Cipher cipher = Cipher.getInstance(CIPHER_MODE); // 查看数据块位数 默认为16(byte) * 8 =128 bit
// System.out.println("数据块位数(byte):" + cipher.getBlockSize()); // 初始化Cipher实例。设置执行模式以及加密密钥
cipher.init(Cipher.DECRYPT_MODE, keySpec, new IvParameterSpec(IV.getBytes(CHARACTER)));
// 执行
byte[] clearTextBytes = cipher.doFinal(ciphertext);
return clearTextBytes;
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (InvalidKeyException e) {
e.printStackTrace();
} catch (NoSuchPaddingException e) {
e.printStackTrace();
} catch (BadPaddingException e) {
e.printStackTrace();
} catch (IllegalBlockSizeException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
// 解密错误 返回 null
return null;
}
加密后通常配合 Base64 进行编码
public static void main(String[] args) {
String str = "NiHao";
byte[] encryptAES = encryptAES(str, "1234567899874563");
String encryptBase64 = encryptBase64(encryptAES); byte[] decryptBase64 = decryptBase64(encryptBase64);
byte[] decryptAES = decryptAES(decryptBase64, "1234567899874563");
System.out.println(new String(decryptAES));
} /**
* BASE64 加密
*
* @param cleartext 明文
* @return 密文
*/
public static String encryptBase64(byte[] cleartext) {
BASE64Encoder base64Encoder = new BASE64Encoder();
String cipherText = base64Encoder.encode(cleartext);
return cipherText;
} /**
* BASE64 解密
*
* @param cipherText 密文
* @return 明文
*/
public static byte[] decryptBase64(String cipherText) {
try {
BASE64Decoder base64Decoder = new BASE64Decoder();
byte[] cipherTextBytes = base64Decoder.decodeBuffer(cipherText);
return cipherTextBytes;
} catch (IOException e) {
e.printStackTrace();
}
// 解密错误返回 null
return null;
}
也可以使用 16 进制编码
public static void main(String[] args) {
String str = "NiHao";
byte[] encryptAES = encryptAES(str, "1234567899874563");
String encryptHex = encryptHex(encryptAES); byte[] decryptHex = decryptHex(encryptHex);
byte[] decryptAES = decryptAES(decryptHex, "1234567899874563");
System.out.println(new String(decryptAES));
} /**
* HEX 加密(字节数组转成16进制字符串)
*
* @param clearText 明文
* @return 密文
*/
public static String encryptHex(byte[] clearText) {
// 一个字节的数,
StringBuffer sb = new StringBuffer(clearText.length * 2);
String tmp = "";
for (int n = 0; n < clearText.length; n++) {
// 整数转成十六进制表示
tmp = (java.lang.Integer.toHexString(clearText[n] & 0XFF));
if (tmp.length() == 1) {
sb.append("0");
}
sb.append(tmp);
}
// 转成大写
String cipherText = sb.toString().toUpperCase();
return cipherText;
} /**
* HEX 解密(16进制字符串转换成字节数组)
*
* @param cipherText 密文
* @return 明文
*/
public static byte[] decryptHex(String cipherText) {
if (cipherText == null || cipherText.length() < 2) {
return new byte[0];
}
cipherText = cipherText.toLowerCase();
int l = cipherText.length() / 2;
byte[] cipherTextBytes = new byte[l];
for (int i = 0; i < l; ++i) {
String tmp = cipherText.substring(2 * i, 2 * i + 2);
cipherTextBytes[i] = (byte) (Integer.parseInt(tmp, 16) & 0xFF);
}
return cipherTextBytes;
}
编码后若作为 URL 参数还需进行 URI 转换
public static String encodeURIComponent(String s) {
String result = null;
try {
result = URLEncoder.encode(s, CHARACTER)
.replaceAll("\\+", "%20")
.replaceAll("\\%21", "!")
.replaceAll("\\%27", "'")
.replaceAll("\\%28", "(")
.replaceAll("\\%29", ")")
.replaceAll("\\%7E", "~");
} catch (UnsupportedEncodingException e) {
result = s;
}
return result;
} public static String decodeURIComponent(String s) {
if (s == null) {
return null;
}
String result = null;
try {
result = URLDecoder.decode(s, CHARACTER);
} catch (UnsupportedEncodingException e) {
result = s;
}
return result;
}
https://segmentfault.com/a/1190000015943620
https://blog.csdn.net/wangweiren_get/article/details/82585629
Java-AESUtil的更多相关文章
- Spark案例分析
一.需求:计算网页访问量前三名 import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} /* ...
- java PKCS7Padding 加密Cannot find any provider supporting AES/CBC/PKCS7Padding 解决办法
在java中用aes256进行加密,但是发现java里面不能使用PKCS7Padding,而java中自带的是PKCS5Padding填充,那解决办法是,通过BouncyCastle组件来让java里 ...
- aes 解密出现 java.lang.NumberFormatException: Invalid int: "ch"
原因: 将加密/解密的seed 和 加密内容顺序放反. decrypt(String seed, String encrypted) 附上AES解密/加密代码(android开发): package ...
- 【JAVA - 基础】之数据加密和解密
1.Base64工具类(可逆): import java.util.HashMap; import java.util.Map; /** * Base64加解密算法 * </p> * Ba ...
- JAVA WEB实现前端加密后台解密
最近在研究登陆密码的加密,下边上具体代码,只是给出核心代码,具体的代码视业务而定吧,给位有什么问题或者意见请留言. 加密方法用的是AES-128-CBC,BASE64用的是org.apache.com ...
- CBC之php java兼容版本
网上搜了N多代码,都是你抄我的,我抄你的,着实让人无语对苍天.经过多番资料的查找,php与java的cbc加密.解密结果终于一致了,代码如下: Java加密解密类: package main; imp ...
- C#调用java包里的方法
用IKVM,步骤: 下载ikvmbin-7.2.4630.5.zip,解压,把bin目录所在路径加到环境变量path里 2.电脑开始->CMD,输入ikvmc –out:”输出dll文件的路径” ...
- java独立小程序实现AES加密和解密
一.需求: web项目中配置文件配置的密码是明文的, 现在需要修改成密文, 加密方式采用AES, 于是写了个工具类用于加密和解密. 又因为这个密码是由客户来最终确定, 所以为了部署时方便起见, 写了个 ...
- java 加密工具类(MD5、RSA、AES等加密方式)
1.加密工具类encryption MD5加密 import org.apache.commons.codec.digest.DigestUtils; /** * MD5加密组件 * * @autho ...
- AES 加解密 Java实现
package com.smt.cipher.symmetry; import java.nio.charset.Charset; import java.security.SecureRandom; ...
随机推荐
- CSS 使用calc()获取当前可视屏幕高度
来自:https://blog.csdn.net/qq_32063079/article/details/89766442 先了解一下CSS3的相对长度单位(参考详细教程) : 相对长度单位指定了一个 ...
- Docker 容器数据卷(Data Volume)与数据管理
卷(Volume)是容器中的一个数据挂载点,卷可以绕过联合文件系统,从而为Docker 提供持久数据,所提供的数据还可以在宿主机-容器或多个容器之间共享.通过卷,我们可以可以使修改数据直接生效,而不必 ...
- 7.Struts2拦截器及源码分析
1.Struts2架构图 2.Struts2 执行过程分析 1.首先,因为使用 struts2 框架,请求被Struts2Filter 拦截 2.Struts2Filter 调用 DisPatche ...
- MySQL表内更新时,自动记录时间
1.创建表: create table test_time(id int primary key not null,status varchar(24),create_time datetime d ...
- Win7自带的系统备份还原功能如何去使用?
很多用户都会反映Win7系统使用过程中会出现系统或应用程序方面的小故障,针对这些小问题,再选择进行电脑系统的重装就有些过于麻烦了. 其实Win7系统内带有系统备份和还原的功能,可以在电脑系统出现小问题 ...
- linux使用nginx配置web服务器
环境: CenterOS 7 1.安装nginx之前先安装nginx所需的依赖包 yum -y install zlib zlib-devel openssl openssl-devel pcre p ...
- python异常:常见异常、处理、断言、自定义异常
一.异常是什么 二.常见异常 三.异常处理 四.不太常用语法 五.主动判处异常 六.断言 七.使用场景 八.自定义异常类型 一.异常是什么 """ 什么是异常? 异常是错 ...
- Tomcat 7 简单定制
Tomcat笔记 安装 wget https://mirrors.huaweicloud.com/apache/tomcat/tomcat-7/v7.0.96/bin/apache-tomcat-7. ...
- PHP内置常量,和可变变量,常量的定义
关键常量 可变变量----变量名是变量的变量 常量的定义
- 第十一章 前端开发-bootstrap
11.5.0 bootstrap 11.5.1 bootstrap的介绍和响应式 http://book.luffycity.com/python-book/95-bootstrap/951-boot ...