package org.yzh.commons.util;
|
|
import lombok.SneakyThrows;
|
|
import javax.crypto.Cipher;
|
import javax.crypto.KeyGenerator;
|
import javax.crypto.spec.IvParameterSpec;
|
import javax.crypto.spec.SecretKeySpec;
|
import java.nio.charset.StandardCharsets;
|
import java.security.NoSuchAlgorithmException;
|
import java.security.SecureRandom;
|
|
/**
|
* 加密工具类
|
* @author yezhihao
|
* https://gitee.com/yezhihao/jt808-server
|
*/
|
public class EncryptUtils {
|
|
private static SecretKeySpec DefKey;
|
|
private static IvParameterSpec DefInitVector;
|
|
private static final String MODE = "AES/CTR/NoPadding";
|
// private static final String MODE = "AES/CBC/PKCS5Padding";
|
|
static {
|
initial();
|
}
|
|
@SneakyThrows
|
public static void initial() {
|
initial(System.getProperty("user.name", "unknown"));
|
}
|
|
public static void initial(String secret) throws NoSuchAlgorithmException {
|
SecureRandom random = SecureRandom.getInstance("SHA1PRNG");
|
random.setSeed(secret.getBytes(StandardCharsets.UTF_8));
|
|
KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
|
keyGenerator.init(128, random);
|
|
//私钥 AES固定格式为128/192/256 bits.即:16/24/32bytes。DES固定格式为128bits,即8bytes。
|
DefKey = new SecretKeySpec(keyGenerator.generateKey().getEncoded(), "AES");
|
//初始向量 AES 为16bytes. DES 为8bytes
|
DefInitVector = new IvParameterSpec(keyGenerator.generateKey().getEncoded());
|
}
|
|
@SneakyThrows
|
public static byte[] encrypt(SecretKeySpec key, IvParameterSpec initVector, byte[] message) {
|
Cipher cipher = Cipher.getInstance(MODE);
|
cipher.init(Cipher.ENCRYPT_MODE, key, initVector);
|
return cipher.doFinal(message);
|
}
|
|
public static byte[] encrypt(String key, String initVector, byte[] message) {
|
return encrypt(new SecretKeySpec(key.getBytes(StandardCharsets.UTF_8), "AES"), new IvParameterSpec(initVector.getBytes(StandardCharsets.UTF_8)), message);
|
}
|
|
public static byte[] encrypt(byte[] message) {
|
return encrypt(DefKey, DefInitVector, message);
|
}
|
|
@SneakyThrows
|
public static byte[] decrypt(SecretKeySpec key, IvParameterSpec initVector, byte[] message) {
|
Cipher cipher = Cipher.getInstance(MODE);
|
cipher.init(Cipher.DECRYPT_MODE, key, initVector);
|
return cipher.doFinal(message);
|
}
|
|
public static byte[] decrypt(String key, String initVector, byte[] message) {
|
return decrypt(new SecretKeySpec(key.getBytes(StandardCharsets.UTF_8), "AES"), new IvParameterSpec(initVector.getBytes(StandardCharsets.UTF_8)), message);
|
}
|
|
public static byte[] decrypt(byte[] message) {
|
return decrypt(DefKey, DefInitVector, message);
|
}
|
}
|