package com.hhh.platform.jcjg.scheduledtask.stattistics_bj;
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import cn.hutool.core.codec.Base64;
import com.hhh.platform.configuration.utils.StringUtils;
/**
* AES加密 ------CBC
* author cjk
* date 2023-06-20 10:27:31
*
**/
public class AES {
/**
* 编码
*/
private static final String ENCODING = "UTF-8";
/**
* 算法定义
*/
private static final String AES_ALGORITHM = "AES";
/**
* 指定填充方式
*/
private static final String CIPHER_CBC_PADDING = "AES/CBC/PKCS5Padding";
/**
* 偏移量(CBC中使用,增强加密算法强度)
*/
private static final String IV_SEED = "91QtKjGboCteV123";
public static void main(String [] args){
String prtnum = "2002130231132";
String date = "2023-06-21 10:10:10";
//appKey
String appKey = "12400e90c964-460ebe953ae2a8e55555";
//秘钥
String secret = "91QtKjGboCteV222";
//将Data AES加密转成sign
//String sign = "alarmDesc=产品数据不合格产生警告&alarmType=不合格报警&reportDate=2023-05-30 10:10:10&reportId=2002130231132&appKey=12400e90c964-460ebe953ae2a8e73662";
//加密内容
String sign = "alarmDesc=产品数据不合格产生警告&"+"alarmType=不合格报警&"+"reportDate="+date+"&reportID="+prtnum+"&appKey="+appKey;
// AES支持三种长度的密钥:128位、192位、256位。
// 代码中这种就是128位的加密密钥,16字节 * 8位/字节 = 128位。
System.out.println("--------AES_CBC加密解密---------");
String cbcResult = encryptCBC(sign, secret);
System.out.println("aes_cbc加密结果:" + cbcResult);
System.out.println();
System.out.println("---------解密CBC---------");
String cbcDecrypt = decryptCBC(cbcResult, secret);
System.out.println("aes解密结果:" + cbcDecrypt);
System.out.println();
}
public static String encryptCBC(String content, String aesKey){
//判断秘钥是否为16位
if(aesKey != null && !"".equals(aesKey) && aesKey.length() == 16){
try {
//对密码进行编码
byte[] bytes = aesKey.getBytes(ENCODING);
//设置加密算法,生成秘钥
SecretKeySpec skeySpec = new SecretKeySpec(bytes, AES_ALGORITHM);
// "算法/模式/补码方式"
Cipher cipher = Cipher.getInstance(CIPHER_CBC_PADDING);
//偏移
IvParameterSpec iv = new IvParameterSpec(IV_SEED.getBytes(ENCODING));
//选择加密
cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv);
//根据待加密内容生成字节数组
byte[] encrypted = cipher.doFinal(content.getBytes(ENCODING));
//返回base64字符串
return Base64.encode(encrypted);
} catch (Exception e) {
throw new RuntimeException(e);
}
}else {
return null;
}
}
/**
* AES_CBC解密
*
* @param content 待解密内容
* @param aesKey 密码
* @return
*/
public static String decryptCBC(String content, String aesKey){
//判断秘钥是否为16位
if(StringUtils.isNotBlank(aesKey) && aesKey.length() == 16){
try {
//对密码进行编码
byte[] bytes = aesKey.getBytes(ENCODING);
//设置解密算法,生成秘钥
SecretKeySpec skeySpec = new SecretKeySpec(bytes, AES_ALGORITHM);
//偏移
IvParameterSpec iv = new IvParameterSpec(IV_SEED.getBytes(ENCODING));
// "算法/模式/补码方式"
Cipher cipher = Cipher.getInstance(CIPHER_CBC_PADDING);
//选择解密
cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv);
//先进行Base64解码
byte[] decodeBase64 = Base64.decode(content);
//根据待解密内容进行解密
byte[] decrypted = cipher.doFinal(decodeBase64);
//将字节数组转成字符串
return new String(decrypted, ENCODING);
} catch (Exception e) {
throw new RuntimeException(e);
}
}else {
return null;
}
}
}