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