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; ...
随机推荐
- html和css制作百度界面
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 价值19.9元 <问药师 - 儿童维生素D的补充> 总结
1岁以上的婴幼儿(一直到18岁), 每天应该补充维生素D 400-800UI, 这其中应包含当天的晒太阳时间. 1岁以下400UI户外晒太阳时间, 夏季30分钟, 冬季2小时, 再根据实际情况加减每天 ...
- 【5】Zookeeper的ZAB协议
一.ZAB协议(原子消息广播协议) ZAB(Zookeeper Atomic Broadcast)协议是Zookeeper用来保证其数据一致性的核心算法,是一种支持崩溃恢复的原子广播协议.基于此协 ...
- 【转】tar命令详解
原文:http://www.cnblogs.com/qq78292959/archive/2011/07/06/2099427.html tar -c: 建立压缩档案-x:解压-t:查看内容-r:向压 ...
- JS笔记02
回顾: html: 超文本标记语言 后缀名: *.html 或 *.htm 标签分类: 围堵标签: 双标签 <html>标签体</html> 空标签: 单标签 <br/& ...
- 5.Nginx的session一致性(共享)问题配置方案1
1:Session共享 为什么要实现共享,如果你的网站是存放在一个机器上,那么会话数据就在这台机器,但是如果你使用了负载均衡把请求分发到不同的机器呢?这个时候会话 id在客户端是没有问题的,但是如果用 ...
- winform Combox绑定数据时不触发SelectIndexChanged事件
做了一个仓库选择的联动,选了仓库选其下的货区,选了货区选其下的货架分区.每个combox初始化.绑定数据是都会触发SelectIndexChanged事件,相当头疼. 后来无意中在网上看到了一种方法— ...
- Linux之apt-get软件管理
apt-get 用Linux apt-get命令的第一步就是引入必需的软件库,Debian的软件库也就是所有Debian软件包的集合,它们存在互联网上的一些公共站点上.把它们的地址加入,apt-get ...
- MFC Bitmap::FromBITMAPINFO返回空问题
领导临时给了一个任务,项目上的一个问题,就是FromBITMAPINFO不成功,之前也没有弄过MFC的东西,但领导让干就干吧.咱也不知道怎么回事,咱也不敢问. 上来直接度娘,试过各种办法,都没与解决, ...
- 第二章 Vue快速入门--10-11 跑马灯效果制作
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8&quo ...