wjc
2023-06-28 14de918a79943e4961b09fa01ed320c6cad41f2e
HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/utils/AesUtil.java
New file
@@ -0,0 +1,150 @@
package com.hdl.sdk.link.core.utils;
import android.text.TextUtils;
import com.hdl.sdk.link.common.utils.LogUtils;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.Key;
import java.security.NoSuchAlgorithmException;
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/CBC/PKCS7Padding";
    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(), CIPHER_INSTANCE, true, null);
    }
    /**
     * AES解密
     *
     * @param key
     * @return
     * @throws Exception
     */
    public static byte[] aesDecrypt(byte[] content, String key) {
        if (content == null || TextUtils.isEmpty(key)) {
            LogUtils.i("数据解密:","content:"+content+" key:"+key);
            return null;
        }
        return decrypt(content, key.getBytes(), CIPHER_INSTANCE, true, 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 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;
    }
}