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; ...
随机推荐
- vue学习(5)-评论功能(利用父组件的方法)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 在Windows server 2019 Core 版本上安装SQL2016
安装系统后,通过网络等方式先把安装ISO的文件copy过来,虚拟机则用挂一个虚拟光驱即可,然后cd进入目录,执行以下命名即可安装核心服务了: Setup.exe /qs /ACTION=Install ...
- java指定运行jar包中的其中一个main方法
java -cp jar包 类名 java -cp ******.jar com.******.EsEtl
- Linux useradd userdel groupadd groupdel gpasswd(组成员管理) id groups
添加用户 useradd [选项] 用户名 -u :指定UID标记号 -d:指定宿主目录,缺省为/home/用户名 -g:指定所属的基本组(组名或GID) -G: 指定所属的附加组(组名或GID) - ...
- Linux用户组管理及用户权限4
权限管理: ls -l rwxrwxrwx: 左三位:定义user(owner)的权限 中三位:定义group的权限 ...
- 11.tensorboard网络结构
import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_data # 载入数据集 mnist = i ...
- Selenium(2)
testing123456peter123456rose123456 一.常见的运行错误: 1.[error] Timed out after 30000ms Timed out:超时 after:之 ...
- 完全平方数 HYSBZ - 2440 (莫比乌斯函数容斥)
完全平方数 HYSBZ - 2440 小 X 自幼就很喜欢数.但奇怪的是,他十分讨厌完全平方数.他觉得这些 数看起来很令人难受.由此,他也讨厌所有是完全平方数的正整数倍的数.然而 这丝毫不影响他对其他 ...
- 牛客小白月赛12 D 月月给华华出题 (欧拉函数,数论,线筛)
链接:https://ac.nowcoder.com/acm/contest/392/D 来源:牛客网 月月给华华出题 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 131072K, ...
- vs调试时,不显示局部变量
为了测试一个函数的返回值,就在某个函数里加了一个局部变量,调试却不显示所添加变量的信息. 你一定设置成了release 模式.改为debug就可以了. 比较弱智的问题,mark一下.