在线版 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的更多相关文章

  1. Spark案例分析

    一.需求:计算网页访问量前三名 import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} /* ...

  2. java PKCS7Padding 加密Cannot find any provider supporting AES/CBC/PKCS7Padding 解决办法

    在java中用aes256进行加密,但是发现java里面不能使用PKCS7Padding,而java中自带的是PKCS5Padding填充,那解决办法是,通过BouncyCastle组件来让java里 ...

  3. aes 解密出现 java.lang.NumberFormatException: Invalid int: "ch"

    原因: 将加密/解密的seed 和 加密内容顺序放反.  decrypt(String seed, String encrypted) 附上AES解密/加密代码(android开发): package ...

  4. 【JAVA - 基础】之数据加密和解密

    1.Base64工具类(可逆): import java.util.HashMap; import java.util.Map; /** * Base64加解密算法 * </p> * Ba ...

  5. JAVA WEB实现前端加密后台解密

    最近在研究登陆密码的加密,下边上具体代码,只是给出核心代码,具体的代码视业务而定吧,给位有什么问题或者意见请留言. 加密方法用的是AES-128-CBC,BASE64用的是org.apache.com ...

  6. CBC之php java兼容版本

    网上搜了N多代码,都是你抄我的,我抄你的,着实让人无语对苍天.经过多番资料的查找,php与java的cbc加密.解密结果终于一致了,代码如下: Java加密解密类: package main; imp ...

  7. C#调用java包里的方法

    用IKVM,步骤: 下载ikvmbin-7.2.4630.5.zip,解压,把bin目录所在路径加到环境变量path里 2.电脑开始->CMD,输入ikvmc –out:”输出dll文件的路径” ...

  8. java独立小程序实现AES加密和解密

    一.需求: web项目中配置文件配置的密码是明文的, 现在需要修改成密文, 加密方式采用AES, 于是写了个工具类用于加密和解密. 又因为这个密码是由客户来最终确定, 所以为了部署时方便起见, 写了个 ...

  9. java 加密工具类(MD5、RSA、AES等加密方式)

    1.加密工具类encryption MD5加密 import org.apache.commons.codec.digest.DigestUtils; /** * MD5加密组件 * * @autho ...

  10. AES 加解密 Java实现

    package com.smt.cipher.symmetry; import java.nio.charset.Charset; import java.security.SecureRandom; ...

随机推荐

  1. CSS 使用calc()获取当前可视屏幕高度

    来自:https://blog.csdn.net/qq_32063079/article/details/89766442 先了解一下CSS3的相对长度单位(参考详细教程) : 相对长度单位指定了一个 ...

  2. Docker 容器数据卷(Data Volume)与数据管理

    卷(Volume)是容器中的一个数据挂载点,卷可以绕过联合文件系统,从而为Docker 提供持久数据,所提供的数据还可以在宿主机-容器或多个容器之间共享.通过卷,我们可以可以使修改数据直接生效,而不必 ...

  3. 7.Struts2拦截器及源码分析

    1.Struts2架构图 2.Struts2 执行过程分析 1.首先,因为使用 struts2 框架,请求被Struts2Filter 拦截 2.Struts2Filter  调用 DisPatche ...

  4. MySQL表内更新时,自动记录时间

    1.创建表: create table test_time(id int primary key not null,status  varchar(24),create_time datetime d ...

  5. Win7自带的系统备份还原功能如何去使用?

    很多用户都会反映Win7系统使用过程中会出现系统或应用程序方面的小故障,针对这些小问题,再选择进行电脑系统的重装就有些过于麻烦了. 其实Win7系统内带有系统备份和还原的功能,可以在电脑系统出现小问题 ...

  6. linux使用nginx配置web服务器

    环境: CenterOS 7 1.安装nginx之前先安装nginx所需的依赖包 yum -y install zlib zlib-devel openssl openssl-devel pcre p ...

  7. python异常:常见异常、处理、断言、自定义异常

    一.异常是什么 二.常见异常 三.异常处理 四.不太常用语法 五.主动判处异常 六.断言 七.使用场景 八.自定义异常类型 一.异常是什么 """ 什么是异常? 异常是错 ...

  8. Tomcat 7 简单定制

    Tomcat笔记 安装 wget https://mirrors.huaweicloud.com/apache/tomcat/tomcat-7/v7.0.96/bin/apache-tomcat-7. ...

  9. PHP内置常量,和可变变量,常量的定义

    关键常量 可变变量----变量名是变量的变量 常量的定义

  10. 第十一章 前端开发-bootstrap

    11.5.0 bootstrap 11.5.1 bootstrap的介绍和响应式 http://book.luffycity.com/python-book/95-bootstrap/951-boot ...