Java 加密解密工具類
阿新 • • 發佈:2020-12-16
技術標籤:演算法
使用Hutool開源工具類實現加密加密
AES加密解密
String content = "test中文";
//隨機生成金鑰
byte[] key = SecureUtil.generateKey(SymmetricAlgorithm.AES.getValue()).getEncoded();
//構建
AES aes = SecureUtil.aes(key);
//加密
byte[] encrypt = aes.encrypt(content);
//解密
byte[] decrypt = aes.decrypt(encrypt);
//加密為16進製表示
String encryptHex = des.encryptHex(content);
//解密為原字串
String decryptStr = des.decryptStr(encryptHex);
DES加密解密
DES的使用方式與AES基本一致
String content = "test中文";
//隨機生成金鑰
byte[] key = SecureUtil.generateKey(SymmetricAlgorithm.DES.getValue()).getEncoded();
//構建
DES des = SecureUtil.des(key);
//加密解密
byte [] encrypt = des.encrypt(content);
byte[] decrypt = des.decrypt(encrypt);
//加密為16進位制,解密為原字串
String encryptHex = des.encryptHex(content);
String decryptStr = des.decryptStr(encryptHex);
AES加密解密工具類
import lombok.extern.slf4j.Slf4j;
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
/**
* 加密解密工具類
*
* @author zhaoyang10
* @date 2020/12/15
*/
@Slf4j
public class AesUtil {
private static final String KEY_AES = "AES";
private static final int KEY_LENGTH = 16;
/**
* 加密
*/
public static String encrypt(String src, String key) {
try {
if (key == null || key.length() != KEY_LENGTH) {
throw new IllegalArgumentException("金鑰長度必須是16位");
}
byte[] raw = key.getBytes();
SecretKeySpec skySpec = new SecretKeySpec(raw, KEY_AES);
Cipher cipher = Cipher.getInstance(KEY_AES);
cipher.init(Cipher.ENCRYPT_MODE, skySpec);
byte[] encrypted = cipher.doFinal(src.getBytes());
return byte2hex(encrypted);
} catch (Exception e) {
log.error("AES加密方法出錯", e);
}
return null;
}
public static String decrypt(String src, String key) {
try {
if (key == null || key.length() != KEY_LENGTH) {
throw new IllegalArgumentException("金鑰長度必須是16位");
}
byte[] raw = key.getBytes();
SecretKeySpec skySpec = new SecretKeySpec(raw, KEY_AES);
Cipher cipher = Cipher.getInstance(KEY_AES);
cipher.init(Cipher.DECRYPT_MODE, skySpec);
byte[] encrypted1 = hex2byte(src);
byte[] original = cipher.doFinal(encrypted1);
return new String(original);
} catch (Exception e) {
log.error("AES解密出錯", e);
}
return null;
}
public static byte[] hex2byte(String hex) {
if (hex == null) {
return new byte[0];
}
int l = hex.length();
int n = 2;
if (l % n == 1) {
return new byte[0];
}
byte[] b = new byte[l / 2];
for (int i = 0; i != l / n; i++) {
b[i] = (byte) Integer.parseInt(hex.substring(i * 2, i * 2 + 2),
16);
}
return b;
}
public static String byte2hex(byte[] b) {
StringBuilder hs = new StringBuilder();
String tmp;
for (byte value : b) {
tmp = (Integer.toHexString(value & 0XFF));
if (tmp.length() == 1) {
hs.append("0").append(tmp);
} else {
hs.append(tmp);
}
}
return hs.toString().toUpperCase();
}
public static void main(String[] args) {
String content = "http://s3zz.ad.weibo.com/license/1231xxqrq3rr44q.jpg#13121121231231";
log.info("原內容 = {}", content);
String encrypt = AesUtil.encrypt(content, "aWXoyC4UNb111111");
log.info("加密後 = {}", encrypt);
String decrypt = AesUtil.decrypt(encrypt, "aWXoyC4UNb111111");
log.info("解密後 = {}", decrypt);
}
}