| | |
| | | package com.ruoyi.doublePrevention.utilsCJ;//package com.gkhy.safePlatform.doublePrevention.utilsCJ;
|
| | | //
|
| | | //import com.f2bpm.upload.interfaces.ConstantUpload;
|
| | | //import org.bouncycastle.crypto.DataLengthException;
|
| | | //import org.bouncycastle.crypto.InvalidCipherTextException;
|
| | | //import org.bouncycastle.crypto.engines.AESFastEngine;
|
| | | //import org.bouncycastle.crypto.modes.GCMBlockCipher;
|
| | | //import org.bouncycastle.crypto.params.AEADParameters;
|
| | | //import org.bouncycastle.crypto.params.KeyParameter;
|
| | | //
|
| | | //import java.io.UnsupportedEncodingException;
|
| | | //import java.nio.charset.StandardCharsets;
|
| | | //import java.security.SecureRandom;
|
| | | //import java.util.Base64;
|
| | | //
|
| | | ///**
|
| | | // * AES-GCM-256 工具类
|
| | | // *
|
| | | // * @author :LX(长沙麓谷)
|
| | | // * @date 创建时间: 2022/8/3 14:05
|
| | | // */
|
| | | //public class AesGcm256Util {
|
| | | //
|
| | | // /**
|
| | | // * 随机数生成
|
| | | // */
|
| | | // private static final SecureRandom SECURE_RANDOM = new SecureRandom();
|
| | | //
|
| | | // public static final int NONCE_BIT_SIZE = 128;
|
| | | // public static final int MAC_BIT_SIZE = 128;
|
| | | // public static final int KEY_BIT_SIZE = 256;
|
| | | //
|
| | | //
|
| | | // private AesGcm256Util(){}
|
| | | //
|
| | | //
|
| | | // /**
|
| | | // * 创建密钥
|
| | | // * @return 密钥
|
| | | // */
|
| | | // public static byte[] key() {
|
| | | // byte[] key = new byte[KEY_BIT_SIZE / 8];
|
| | | // SECURE_RANDOM.nextBytes(key);
|
| | | // return key;
|
| | | // }
|
| | | //
|
| | | // /**
|
| | | // * 创建向量
|
| | | // * @return 向量
|
| | | // */
|
| | | // public static byte[] iv() {
|
| | | // byte[] iv = new byte[NONCE_BIT_SIZE / 8];
|
| | | // SECURE_RANDOM.nextBytes(iv);
|
| | | // return iv;
|
| | | // }
|
| | | //
|
| | | // /**
|
| | | // * 编码
|
| | | // * @param hexStr 要编码的文本
|
| | | // * @return 字节数组
|
| | | // */
|
| | | // public static byte[] hexToByte(String hexStr) {
|
| | | // int len = hexStr.length();
|
| | | // byte[] data = new byte[len / 2];
|
| | | // for (int i = 0; i < len; i += 2) {
|
| | | // data[i / 2] = (byte) ((Character.digit(hexStr.charAt(i), 16) << 4)
|
| | | // + Character.digit(hexStr.charAt(i + 1), 16));
|
| | | // }
|
| | | // return data;
|
| | | // }
|
| | | //
|
| | | // /**
|
| | | // * 转换为十六进制
|
| | | // * @param data 字节数组
|
| | | // * @return 转换的十六进制数据
|
| | | // */
|
| | | // public static String toHex(byte[] data) {
|
| | | // StringBuilder ret = new StringBuilder();
|
| | | // for (byte datum : data) {
|
| | | // String hex = Integer.toHexString(datum & 0xFF);
|
| | | // if (hex.length() == 1) {
|
| | | // hex = '0' + hex;
|
| | | // }
|
| | | // ret.append(hex.toUpperCase());
|
| | | // }
|
| | | // return ret.toString();
|
| | | // }
|
| | | //
|
| | | // /**
|
| | | // * 加密
|
| | | // * @param plainText 要加密的明文文本
|
| | | // * @param key 密钥
|
| | | // * @param iv 向量
|
| | | // * @return
|
| | | // */
|
| | | // public static String encrypt(String plainText, String key, String iv) throws UnsupportedEncodingException {
|
| | | // return encrypt(plainText, key.getBytes(ConstantUpload.Base.UTF-8), iv.getBytes(ConstantUpload.Base.UTF-8));
|
| | | // }
|
| | | //
|
| | | // /**
|
| | | // * 加密
|
| | | // * @param plainText 要加密的明文文本
|
| | | // * @param key 密钥
|
| | | // * @param iv 向量
|
| | | // * @return
|
| | | // */
|
| | | // public static String encrypt(String plainText, byte[] key, byte[] iv) {
|
| | | // String sr;
|
| | | // try {
|
| | | // byte[] plainBytes = plainText.getBytes(StandardCharsets.UTF_8);
|
| | | // GCMBlockCipher cipher = new GCMBlockCipher(new AESFastEngine());
|
| | | // AEADParameters parameters = new AEADParameters(new KeyParameter(key), MAC_BIT_SIZE, iv, null);
|
| | | // cipher.init(true, parameters);
|
| | | // byte[] encryptedBytes = new byte[cipher.getOutputSize(plainBytes.length)];
|
| | | // int retLen = cipher.processBytes(plainBytes, 0, plainBytes.length, encryptedBytes, 0);
|
| | | // cipher.doFinal(encryptedBytes, retLen);
|
| | | // sr = Base64.getEncoder().encodeToString(encryptedBytes);
|
| | | // } catch (Exception ex) {
|
| | | // throw new RuntimeException("加密异常! Encryption exception:" + ex.getMessage());
|
| | | // }
|
| | | // return sr;
|
| | | // }
|
| | | //
|
| | | // /**
|
| | | // * 解密
|
| | | // * @param encryptedText 已加密文本
|
| | | // * @param key 密钥
|
| | | // * @param iv 向量
|
| | | // * @return
|
| | | // */
|
| | | // public static String decrypt(String encryptedText, byte[] key, byte[] iv) {
|
| | | // String sr;
|
| | | // try {
|
| | | // byte[] encryptedBytes = Base64.getDecoder().decode(encryptedText);
|
| | | // GCMBlockCipher cipher = new GCMBlockCipher(new AESFastEngine());
|
| | | // AEADParameters parameters = new AEADParameters(new KeyParameter(key), MAC_BIT_SIZE, iv, null);
|
| | | // cipher.init(false, parameters);
|
| | | // byte[] plainBytes = new byte[cipher.getOutputSize(encryptedBytes.length)];
|
| | | // int retLen = cipher.processBytes(encryptedBytes, 0, encryptedBytes.length, plainBytes, 0);
|
| | | // cipher.doFinal(plainBytes, retLen);
|
| | | // sr = new String(plainBytes, StandardCharsets.UTF_8);
|
| | | //
|
| | | // } catch (IllegalArgumentException | IllegalStateException | DataLengthException | InvalidCipherTextException ex) {
|
| | | // throw new RuntimeException("解密异常! Decryption exception:" + ex.getMessage());
|
| | | // }
|
| | | // return sr;
|
| | | // }
|
| | | //}
|
| | | //
|
| | | package com.ruoyi.doublePrevention.utilsCJ;//package com.gkhy.safePlatform.doublePrevention.utilsCJ; |
| | | // |
| | | //import com.f2bpm.upload.interfaces.ConstantUpload; |
| | | //import org.bouncycastle.crypto.DataLengthException; |
| | | //import org.bouncycastle.crypto.InvalidCipherTextException; |
| | | //import org.bouncycastle.crypto.engines.AESFastEngine; |
| | | //import org.bouncycastle.crypto.modes.GCMBlockCipher; |
| | | //import org.bouncycastle.crypto.params.AEADParameters; |
| | | //import org.bouncycastle.crypto.params.KeyParameter; |
| | | // |
| | | //import java.io.UnsupportedEncodingException; |
| | | //import java.nio.charset.StandardCharsets; |
| | | //import java.security.SecureRandom; |
| | | //import java.util.Base64; |
| | | // |
| | | ///** |
| | | // * AES-GCM-256 工具类 |
| | | // * |
| | | // * @author :LX(长沙麓谷) |
| | | // * @date 创建时间: 2022/8/3 14:05 |
| | | // */ |
| | | //public class AesGcm256Util { |
| | | // |
| | | // /** |
| | | // * 随机数生成 |
| | | // */ |
| | | // private static final SecureRandom SECURE_RANDOM = new SecureRandom(); |
| | | // |
| | | // public static final int NONCE_BIT_SIZE = 128; |
| | | // public static final int MAC_BIT_SIZE = 128; |
| | | // public static final int KEY_BIT_SIZE = 256; |
| | | // |
| | | // |
| | | // private AesGcm256Util(){} |
| | | // |
| | | // |
| | | // /** |
| | | // * 创建密钥 |
| | | // * @return 密钥 |
| | | // */ |
| | | // public static byte[] key() { |
| | | // byte[] key = new byte[KEY_BIT_SIZE / 8]; |
| | | // SECURE_RANDOM.nextBytes(key); |
| | | // return key; |
| | | // } |
| | | // |
| | | // /** |
| | | // * 创建向量 |
| | | // * @return 向量 |
| | | // */ |
| | | // public static byte[] iv() { |
| | | // byte[] iv = new byte[NONCE_BIT_SIZE / 8]; |
| | | // SECURE_RANDOM.nextBytes(iv); |
| | | // return iv; |
| | | // } |
| | | // |
| | | // /** |
| | | // * 编码 |
| | | // * @param hexStr 要编码的文本 |
| | | // * @return 字节数组 |
| | | // */ |
| | | // public static byte[] hexToByte(String hexStr) { |
| | | // int len = hexStr.length(); |
| | | // byte[] data = new byte[len / 2]; |
| | | // for (int i = 0; i < len; i += 2) { |
| | | // data[i / 2] = (byte) ((Character.digit(hexStr.charAt(i), 16) << 4) |
| | | // + Character.digit(hexStr.charAt(i + 1), 16)); |
| | | // } |
| | | // return data; |
| | | // } |
| | | // |
| | | // /** |
| | | // * 转换为十六进制 |
| | | // * @param data 字节数组 |
| | | // * @return 转换的十六进制数据 |
| | | // */ |
| | | // public static String toHex(byte[] data) { |
| | | // StringBuilder ret = new StringBuilder(); |
| | | // for (byte datum : data) { |
| | | // String hex = Integer.toHexString(datum & 0xFF); |
| | | // if (hex.length() == 1) { |
| | | // hex = '0' + hex; |
| | | // } |
| | | // ret.append(hex.toUpperCase()); |
| | | // } |
| | | // return ret.toString(); |
| | | // } |
| | | // |
| | | // /** |
| | | // * 加密 |
| | | // * @param plainText 要加密的明文文本 |
| | | // * @param key 密钥 |
| | | // * @param iv 向量 |
| | | // * @return |
| | | // */ |
| | | // public static String encrypt(String plainText, String key, String iv) throws UnsupportedEncodingException { |
| | | // return encrypt(plainText, key.getBytes(ConstantUpload.Base.UTF-8), iv.getBytes(ConstantUpload.Base.UTF-8)); |
| | | // } |
| | | // |
| | | // /** |
| | | // * 加密 |
| | | // * @param plainText 要加密的明文文本 |
| | | // * @param key 密钥 |
| | | // * @param iv 向量 |
| | | // * @return |
| | | // */ |
| | | // public static String encrypt(String plainText, byte[] key, byte[] iv) { |
| | | // String sr; |
| | | // try { |
| | | // byte[] plainBytes = plainText.getBytes(StandardCharsets.UTF_8); |
| | | // GCMBlockCipher cipher = new GCMBlockCipher(new AESFastEngine()); |
| | | // AEADParameters parameters = new AEADParameters(new KeyParameter(key), MAC_BIT_SIZE, iv, null); |
| | | // cipher.init(true, parameters); |
| | | // byte[] encryptedBytes = new byte[cipher.getOutputSize(plainBytes.length)]; |
| | | // int retLen = cipher.processBytes(plainBytes, 0, plainBytes.length, encryptedBytes, 0); |
| | | // cipher.doFinal(encryptedBytes, retLen); |
| | | // sr = Base64.getEncoder().encodeToString(encryptedBytes); |
| | | // } catch (Exception ex) { |
| | | // throw new RuntimeException("加密异常! Encryption exception:" + ex.getMessage()); |
| | | // } |
| | | // return sr; |
| | | // } |
| | | // |
| | | // /** |
| | | // * 解密 |
| | | // * @param encryptedText 已加密文本 |
| | | // * @param key 密钥 |
| | | // * @param iv 向量 |
| | | // * @return |
| | | // */ |
| | | // public static String decrypt(String encryptedText, byte[] key, byte[] iv) { |
| | | // String sr; |
| | | // try { |
| | | // byte[] encryptedBytes = Base64.getDecoder().decode(encryptedText); |
| | | // GCMBlockCipher cipher = new GCMBlockCipher(new AESFastEngine()); |
| | | // AEADParameters parameters = new AEADParameters(new KeyParameter(key), MAC_BIT_SIZE, iv, null); |
| | | // cipher.init(false, parameters); |
| | | // byte[] plainBytes = new byte[cipher.getOutputSize(encryptedBytes.length)]; |
| | | // int retLen = cipher.processBytes(encryptedBytes, 0, encryptedBytes.length, plainBytes, 0); |
| | | // cipher.doFinal(plainBytes, retLen); |
| | | // sr = new String(plainBytes, StandardCharsets.UTF_8); |
| | | // |
| | | // } catch (IllegalArgumentException | IllegalStateException | DataLengthException | InvalidCipherTextException ex) { |
| | | // throw new RuntimeException("解密异常! Decryption exception:" + ex.getMessage()); |
| | | // } |
| | | // return sr; |
| | | // } |
| | | //} |
| | | // |