wjc
2023-06-28 14de918a79943e4961b09fa01ed320c6cad41f2e
HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/utils/mqtt/AesUtil.java
New file
@@ -0,0 +1,286 @@
package com.hdl.sdk.link.core.utils.mqtt;
import com.hdl.sdk.link.common.utils.LogUtils;
import com.hdl.sdk.link.core.utils.HexUtil;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.Key;
import java.security.NoSuchAlgorithmException;
import java.security.Security;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
/**
 * Aes 加解密工具类
 *
 * @author yangtao
 * 2020年10月29日
 */
public class AesUtil {
    private static final String CIPHER_INSTANCE = "AES/ECB/PKCS5Padding";
    private static final String AES_ALGORITHM = "AES";
    static {
        //AES/CBC/PKCS7Padding 依赖
        Security.addProvider(new BouncyCastleProvider());
    }
    /**
     * AES加密
     *
     * @param key
     * @return
     * @throws Exception
     */
    public static byte[] aesEncrypt(byte[] content, String key) {
        return encrypt(content, key.getBytes(), "AES/CBC/PKCS7Padding", true, null);
    }
    /**
     * AES解密
     *
     * @param key
     * @return
     * @throws Exception
     */
    public static byte[] aesDecrypt(byte[] content, String key) {
        return decrypt(content, key.getBytes(), "AES/CBC/PKCS7Padding", true, null);
    }
    /**
     * 加密
     *
     * @param content 待加密字符串
     * @param keyHex  aesKye的hexStr
     * @return
     */
    public static String encrypt(String content, String keyHex) {
        return HexUtil.encodeHexStr(encrypt(content.getBytes(), HexUtil.decodeHex(keyHex), CIPHER_INSTANCE, false, null));
    }
    /**
     * 加密
     *
     * @param content 待加密字符串
     * @param key     密钥
     * @return
     */
    public static String encrypt(String content, byte[] key) {
        return HexUtil.encodeHexStr(encrypt(content.getBytes(), key, CIPHER_INSTANCE, false, null));
    }
    /**
     * 加密
     *
     * @param content 待加密字符串
     * @param keyHex  aesKye的hexStr
     * @return
     */
    public static byte[] encryptReturnByte(String content, String keyHex) {
        return encrypt(content.getBytes(), HexUtil.decodeHex(keyHex), CIPHER_INSTANCE, false, null);
    }
    /**
     * 加密
     *
     * @param content 待加密字符串
     * @param key     密钥
     * @return
     */
    public static byte[] encryptReturnByte(String content, byte[] key) {
        return encrypt(content.getBytes(), key, CIPHER_INSTANCE, false, null);
    }
    /**
     * 加密
     *
     * @param content        待加密字符串
     * @param keyByte        aesKye的hexStr
     * @param cipherInstance AES算法填充方式
     * @param isIv           是否使用偏移量 ECB模式不可用
     * @param iv             偏移量 不传默认密钥
     * @return
     */
    public static byte[] encrypt(byte[] content, byte[] keyByte, String cipherInstance, Boolean isIv, byte[] iv) {
        try {
            //KEY转换
            Key key = new SecretKeySpec(keyByte, AES_ALGORITHM);
            //加密
            Cipher cipher = Cipher.getInstance(cipherInstance);
            if (isIv != null && isIv) {
                //偏移量 不传默认密钥
                if (iv == null) {
                    iv = keyByte;
                }
                IvParameterSpec ivps = new IvParameterSpec(iv);
                cipher.init(Cipher.ENCRYPT_MODE, key, ivps);
            } else {
                cipher.init(Cipher.ENCRYPT_MODE, key);
            }
            byte[] result = cipher.doFinal(content);
            return result;
        } catch (NoSuchAlgorithmException e) {
            LogUtils.e(e.getMessage());
        } catch (InvalidKeyException e) {
            LogUtils.e(e.getMessage());
        } catch (NoSuchPaddingException e) {
            LogUtils.e(e.getMessage());
        } catch (BadPaddingException e) {
            LogUtils.e(e.getMessage());
        } catch (IllegalBlockSizeException e) {
            LogUtils.e(e.getMessage());
        } catch (InvalidAlgorithmParameterException e) {
            LogUtils.e(e.getMessage());
        }
        return null;
    }
    /**
     * 解密
     *
     * @param contentHex 待解密待字符串hexStr
     * @param keyHex     desKye的hexStr
     * @return
     */
    public static String decrypt(String contentHex, String keyHex) {
        return new String(decrypt(HexUtil.decodeHex(contentHex), HexUtil.decodeHex(keyHex), CIPHER_INSTANCE, false, null));
    }
    /**
     * 解密
     *
     * @param contentHex 待解密待字符串hexStr
     * @param key        密钥
     * @return
     */
    public static String decrypt(String contentHex, byte[] key) {
        return new String(decrypt(HexUtil.decodeHex(contentHex), key, CIPHER_INSTANCE, false, null));
    }
    /**
     * 解密
     *
     * @param content 待解密待内容
     * @param keyHex  密钥
     * @return
     */
    public static String decrypt(byte[] content, String keyHex) {
        return new String(decrypt(content, HexUtil.decodeHex(keyHex), CIPHER_INSTANCE, false, null));
    }
    /**
     * 解密
     *
     * @param content 待解密待内容
     * @param key     密钥
     * @return
     */
    public static String decrypt(byte[] content, byte[] key) {
        return new String(decrypt(content, key, CIPHER_INSTANCE, false, null));
    }
    /**
     * 解密
     *
     * @param contentByte    待解密待字符串hexStr
     * @param contentByte    密钥
     * @param cipherInstance AES算法填充方式
     * @param isIv           是否使用偏移量 ECB模式不可用
     * @param iv             偏移量 不传默认密钥
     * @return
     */
    public static byte[] decrypt(byte[] contentByte, byte[] keyByte, String cipherInstance, Boolean isIv, byte[] iv) {
        try {
            //KEY转换
            Key key = new SecretKeySpec(keyByte, AES_ALGORITHM);
            //解密
            Cipher cipher = Cipher.getInstance(cipherInstance);
            if (isIv != null && isIv) {
                //偏移量 不传默认密钥
                if (iv == null) {
                    iv = keyByte;
                }
                IvParameterSpec ivps = new IvParameterSpec(iv);
                cipher.init(Cipher.DECRYPT_MODE, key, ivps);
            } else {
                cipher.init(Cipher.DECRYPT_MODE, key);
            }
            byte[] result = cipher.doFinal(contentByte);
            return result;
        } catch (NoSuchAlgorithmException e) {
            LogUtils.e(e.getMessage());
        } catch (InvalidKeyException e) {
            LogUtils.e(e.getMessage());
        } catch (NoSuchPaddingException e) {
            LogUtils.e(e.getMessage());
        } catch (BadPaddingException e) {
            LogUtils.e(e.getMessage());
        } catch (IllegalBlockSizeException e) {
            LogUtils.e(e.getMessage());
        } catch (InvalidAlgorithmParameterException e) {
            LogUtils.e(e.getMessage());
        }
        return null;
    }
    public static void main(String[] args) {
//        jiemi();
        //jiami();
    }
    public static void jiami() {
        String key = "1f6714fc-fb9b-4a";
        String content = "{\"id\":\"123\",\"objects\":[{\"sid\":\"0001011565879801020200010101\",\"type\":\"PWD\",\"local_id\":\"2\"}],\"time_stamp\":\"1603281282000\"}";
        byte[] res = aesEncrypt(content.getBytes(), key);
        System.out.println(HexUtil.encodeHexStr(res));
    }
    /**
     *
     * @param str
     * @param houseId
     * @return
     */
    public static String jiemi(byte[] str, String houseId) {
        byte[] rs = aesDecrypt(str, HouseIdSecretUtil.getSecret(houseId));
        String content = new String(rs);
        return content;
    }
//    public static void main(String[] args) {
//        try {
//            //第一步: 生成KEY
//            //KeyGenerator keyGenerator = KeyGenerator.getInstance(AES_ALGORITHM);
//            //keyGenerator.init(256);
//            //第二步: 产生密钥
//            //SecretKey secretKey = keyGenerator.generateKey();
//            //第三步: 获取密钥
//            //byte[] keyBytes = secretKey.getEncoded();
//            //System.out.println(byteArrayToHexStr(keyBytes));
//            String src = "aaaaaaaaaVVVVaaaAAAA无";
//            String pwd = "41151AF257BFDB7859EEC62FB341EE95EE42E648FE24E1F8CE8DADE287CC1E5C";
//            String mw = encrypt(src,pwd);
//            System.out.println("mw:"+mw);
//            String jm = decrypt(mw,pwd);
//            System.out.println("jm:"+jm);
//
//        }catch (Exception e){
//
//        }
//
//    }
}