什么是AES?
高级加密标准(英语:Advanced Encryption Standard,缩写:AES)
是一种区块加密标准。AES可以使用128、192和256位密钥,从安全性来看,AES256安全性最高。从性能来看,AES128性能最高。
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.codec.binary.Hex;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.security.Key;
import java.security.Security;
import java.util.Arrays;
/**
* @author xf
* @version 1.0.0
* @ClassName Aes128Util
* @Description TODO AES工具类
* @createTime 2021.03.03 20:44
*/
@Slf4j
public class Aes128Util {
//key为16位(KEY:即密码)
private static final String KEY = "1234567891234567";
//iv为16位(即偏移量,可自订)
private static final String IV = "abcdefghijklmnop";
/**
* 加密 模式:AES/CBC/PKCS7Padding
* @param content 明文
* @return 密文
*/
public static String AESEncode(String content) {
int base = 16;
byte[] keybyte = KEY.getBytes(StandardCharsets.UTF_8);
if (keybyte.length % base != 0) {
int groups = keybyte.length / base + 1;
byte[] temp = new byte[groups * base];
Arrays.fill(temp, (byte) 0);
System.arraycopy(keybyte, 0, temp, 0, keybyte.length);
keybyte = temp;
}
// 初始化
Security.addProvider(new BouncyCastleProvider());
// 转化成JAVA的密钥格式
Key key = new SecretKeySpec(keybyte, "AES");
try {
// 初始化cipher
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding", "BC");
cipher.init(Cipher.ENCRYPT_MODE, key, new IvParameterSpec(IV.getBytes()));
byte[] encryptedText = cipher.doFinal(content.getBytes());
return new String(Hex.encodeHex(encryptedText)).replaceAll("\r\n", "");
} catch (Exception e) {
log.info("AESEncode error", e);
}
return null;
}
/**
* 解密
* @param content 密文
* @return 铭文
*/
public static String AESDecode(String content) {
try {
byte[] raw = KEY.getBytes(StandardCharsets.UTF_8);
Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding", "BC");
IvParameterSpec ivParameter = new IvParameterSpec(IV.getBytes());
cipher.init(Cipher.DECRYPT_MODE, skeySpec, ivParameter);
try {
byte[] encrypted1 = Hex.decodeHex(content);// 先用base64解密
byte[] original = cipher.doFinal(encrypted1);
return new String(original);
} catch (Exception e) {
log.info(e.toString());
return null;
}
} catch (Exception ex) {
log.info(ex.toString());
return null;
}
}
public static void main(String[] args) {
String content = "余生一个帆";
System.out.println("加密前内容:" + content);
String aesEncode = AESEncode(content);
System.out.println("加密后内容:" + aesEncode);
String aesDecode = AESDecode(aesEncode);
System.out.println("解密后内容:" + aesDecode);
}
}
运行结果:
加密前内容:余生一个帆
加密后内容:dee5e7562b2a60212661012f8b01b179
解密后内容:余生一个帆