wjc
2025-04-09 87cd5df70918e6ba1af849c5f026d3719bfdb1ac
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
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 (TextUtils.isEmpty(key)) {
            LogUtils.i("数据解密失败,密钥为空");
            return null;
        }
        if (content==null) {
            LogUtils.i("数据解密失败,content为空");
            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 (Exception e) {
 
        }
        return null;
    }
 
}