AES加密、解密
1.引入依赖
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk15on</artifactId>
<version>1.56</version>
</dependency>
2.加密算法:AES
工作模式:ECB
填充方式:PKCS7Padding
密码:加解密的密码
3.代码:
package com.entity;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import javax.crypto.Cipher;
import java.security.Provider;
import javax.crypto.spec.SecretKeySpec;
import java.security.Security;
/**
* AES加密、解密
* 需要依赖
* AES/ECB/PKCS7Padding7
* <dependency>
* <groupId>org.bouncycastle</groupId>
* <artifactId>bcprov-jdk15on</artifactId>
* <version>1.56</version>
* </dependency>
* @ClassName AesEncrypt
* @Author lp
* @Date 2021/8/11 11:39
*/
public class AesEncrypt {
public static boolean initialized = false;
/** 加密
* @param source 加密内容
* @param password 加密密码 : elevator-ls96333
* @return
*/
public static String encrypt(String source, String password) {
byte[] key = password.getBytes();
initialize();
byte[] result = null;
try {
/**
* 加解密算法/工作模式/填充方式
*/
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS7Padding", "BC");
//创建密钥
SecretKeySpec keySpec = new SecretKeySpec(key, "AES");
// 初始化cipher,常数1为使用加密模式
cipher.init(1, keySpec);
result = cipher.doFinal(source.getBytes("UTF-8"));
} catch (Exception e) {
e.printStackTrace();
}
return parseByte2HexStr(result).toUpperCase();
}
/**
* 解密
* @param source
* @param password
* @return
*/
public static String decrypt(String source, String password) {
byte[] bytes = parseHexStr2Byte(source);
byte[] key = password.getBytes();
initialize();
String result = null;
try {
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS7Padding", "BC");
SecretKeySpec keySpec = new SecretKeySpec(key, "AES");
cipher.init(2, keySpec); //常数2解密模式
byte[] decoded = cipher.doFinal(bytes);
result = new String(decoded, "UTF-8");
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
public static void initialize() {
if (initialized) {
return;
}
//BouncyCastleProvider
Security.addProvider((Provider) new BouncyCastleProvider());
initialized = true;
}
public static String parseByte2HexStr(byte[] buf) {
StringBuffer sb = new StringBuffer();
for (int i = 0; i < buf.length; i++) {
String hex = Integer.toHexString(buf[i] & 0xFF);
if (hex.length() == 1)
hex = '0' + hex;
sb.append(hex.toLowerCase());
}
return sb.toString();
}
public static byte[] parseHexStr2Byte(String hexStr) {
if (hexStr.length() < 1)
return null;
byte[] result = new byte[hexStr.length() / 2];
for (int i = 0; i < hexStr.length() / 2; i++) {
int high = Integer.parseInt(hexStr.substring(i * 2, i * 2 + 1), 16);
int low = Integer.parseInt(hexStr.substring(i * 2 + 1, i * 2 + 2), 16);
result[i] = (byte) (high * 16 + low);
}
return result;
}
public static void main(String[] args) {
//密码只能是128,192或者256位, 1个字节是8位, 一个英文字母或者数字为1个字节 。此处密码设置为16字节
String encrypt = AesEncrypt.encrypt("https://baike.baidu.com/item/hello%20world/85501?fr=aladdin", "elevator-ls96333");
System.out.println("加密"+encrypt);
String decrypt = AesEncrypt.decrypt(encrypt, "elevator-ls96333");
System.out.println("解密"+decrypt);
}
}