|

分享源码
界面截图: |
|
是否带模块: |
- |
备注说明: |
- |
易语言写法下载:
java HUTOOL转换易语言写法.txt
(842 Bytes, 下载次数: 3, 售价: 3 枚 精币)
package com.dy.weld.util;
import cn.hutool.core.util.CharsetUtil;
import cn.hutool.crypto.Mode;
import cn.hutool.crypto.Padding;
import cn.hutool.crypto.symmetric.AES;
import cn.hutool.crypto.symmetric.SymmetricAlgorithm;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import lombok.extern.slf4j.Slf4j;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
/**
* @author
* 密钥必须为16字节或者16字节的倍数的字节型数据。
* 明文必须为16字节或者16字节的倍数的字节型数据,如果不够16字节需要进行补全。
*/
@Slf4j
public class AesUtil {
private static AES aes = null;
/**
* 16字节
*/
private static String keyStr = "1234567890ABCDEF1234567890ABCDEF";// 为了和mysql统一,长度必须为32位
//长度为16位的盐值
private static final String IV_KEY = "1234567890ABCDEF";
static {
// 构建
//随机生成密钥
SecretKeySpec secretKeySpec = new SecretKeySpec(getBytes(keyStr, 16), SymmetricAlgorithm.AES.getValue());
IvParameterSpec ivParameterSpec = new IvParameterSpec(IV_KEY.getBytes());
aes = new AES(Mode.CBC, Padding.PKCS5Padding, secretKeySpec, ivParameterSpec);
}
/**
* 破J时密匙长度是规定了的
* 如果密匙长度有问题会报错:Key length not 128/192/256 bits.
* 意思就比如密匙长度不是16位 就会报错~
* 所以需要填充密匙长度
*
* @param s
* @param length
* @return
*/
private static byte[] getBytes(String s, int length) {
int fixLength = length - s.getBytes().length;
if (s.getBytes().length < length) {
byte[] S_bytes = new byte[length];
System.arraycopy(s.getBytes(), 0, S_bytes, 0, s.getBytes().length);
for (int x = length - fixLength; x < length; x++) {
S_bytes[x] = 0x00;
}
return S_bytes;
}
return s.getBytes();
}
/**
* 加密
*
* @param content 原文
* @Return 加密后的密文
*/
public static String encryptHex(String content) {
if (StringUtils.isBlank(content)) {
return content;
}
try{
// 加密为16进制表示
return aes.encryptHex(content);
}catch (Exception e){
log.error("加密失败, 原文:{}", content, e);
return content;
}
}
/**
* 解密
*
* @param encryptHex 密文
* @return 解密后的原文
*/
public static String decryptHex(String encryptHex) {
// 解密为字符串
try {
if (StringUtils.isBlank(encryptHex)) {
return encryptHex;
}
return aes.decryptStr(encryptHex, CharsetUtil.CHARSET_UTF_8);
} catch (Exception e) {
log.error("解密失败, 原文:{}", encryptHex, e);
return encryptHex;
}
}
public static void main(String[] args) {
String content = "659C09DE";
log.info("content:{}", content);
// 加密为16进制表示
String encryptHex = encryptHex(content);
log.info("encryptHex:{}", encryptHex.toUpperCase());
// 解密为字符串
String decryptStr = decryptHex(encryptHex);
log.info("decryptStr:{}", decryptStr);
}
}
|
|