| 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); | 
|     } | 
| } |