package org.yzh.commons.util; 
 | 
  
 | 
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 volatile SecretKeySpec DefKey; 
 | 
  
 | 
    private static volatile IvParameterSpec DefInitVector; 
 | 
  
 | 
    private static final String MODE = "AES/CTR/NoPadding"; 
 | 
//    private static final String MODE = "AES/CBC/PKCS5Padding"; 
 | 
  
 | 
    static { 
 | 
        initial(); 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 初始化密钥 
 | 
     * @param privateKey 私钥 AES固定格式为128/192/256 bits.即:16/24/32bytes。DES固定格式为128bits,即8bytes。 
 | 
     * @param initVector 初始向量 AES 为16bytes. DES 为8bytes 
 | 
     */ 
 | 
    public static void initial(byte[] privateKey, byte[] initVector) { 
 | 
        DefKey = new SecretKeySpec(privateKey, "AES"); 
 | 
        DefInitVector = new IvParameterSpec(initVector); 
 | 
    } 
 | 
  
 | 
    public static void initial() { 
 | 
        try { 
 | 
            KeyGenerator keyGenerator = KeyGenerator.getInstance("AES"); 
 | 
  
 | 
            SecureRandom keyRandom = SecureRandom.getInstance("SHA1PRNG"); 
 | 
            keyRandom.setSeed("test~!@_128".getBytes(StandardCharsets.UTF_8)); 
 | 
            keyGenerator.init(128, keyRandom); 
 | 
            byte[] key = keyGenerator.generateKey().getEncoded(); 
 | 
  
 | 
            SecureRandom ivRandom = SecureRandom.getInstance("SHA1PRNG"); 
 | 
            ivRandom.setSeed("test~!@_128".getBytes(StandardCharsets.UTF_8)); 
 | 
            keyGenerator.init(128, ivRandom); 
 | 
            byte[] initVector = keyGenerator.generateKey().getEncoded(); 
 | 
  
 | 
            initial(key, initVector); 
 | 
        } catch (NoSuchAlgorithmException e) { 
 | 
            throw new RuntimeException("初始化密钥失败", e); 
 | 
        } 
 | 
    } 
 | 
  
 | 
    public static byte[] encrypt(SecretKeySpec key, IvParameterSpec initVector, byte[] message) { 
 | 
        try { 
 | 
            Cipher cipher = Cipher.getInstance(MODE); 
 | 
            cipher.init(Cipher.ENCRYPT_MODE, key, initVector); 
 | 
  
 | 
            return cipher.doFinal(message); 
 | 
        } catch (Exception e) { 
 | 
            throw new RuntimeException(e); 
 | 
        } 
 | 
    } 
 | 
  
 | 
    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); 
 | 
    } 
 | 
  
 | 
    public static byte[] decrypt(SecretKeySpec key, IvParameterSpec initVector, byte[] message) { 
 | 
        try { 
 | 
            Cipher cipher = Cipher.getInstance(MODE); 
 | 
            cipher.init(Cipher.DECRYPT_MODE, key, initVector); 
 | 
  
 | 
            return cipher.doFinal(message); 
 | 
        } catch (Exception e) { 
 | 
            throw new RuntimeException(e); 
 | 
        } 
 | 
    } 
 | 
  
 | 
    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); 
 | 
    } 
 | 
} 
 |