AES工具类

依赖

1
2
3
4
5
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.13</version>
</dependency>

实现

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
package cn.idea360.idc;


import org.apache.commons.codec.binary.Base64;

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.security.Key;
import java.security.SecureRandom;
import java.util.UUID;

/**
* @author 当我遇上你
* @公众号 当我遇上你
* @since 2020-08-30
*/
public class AESUtils {

// 加密算法有:AES,DES,DESede(DES3)和RSA 四种
private static final String KEY_ALGORITHM = "AES";

//参数分别代表 算法名称/加密模式/数据填充方式
private static final String DEFAULT_CIPHER_ALGORITHM = "AES/CBC/PKCS5Padding";


/**
* content: 加密内容
* slatKey: 加密的盐,16位字符串
* vectorKey: 加密的向量,16位字符串
*/
public static String encrypt(String content, String slatKey, String vectorKey) throws Exception {
//实例化加密类,参数为加密方式,要写全
Cipher cipher = Cipher.getInstance(DEFAULT_CIPHER_ALGORITHM);
//两个参数,第一个为私钥字节数组, 第二个为加密方式 AES或者DES
SecretKey secretKey = new SecretKeySpec(slatKey.getBytes(), KEY_ALGORITHM);
// 偏移量
IvParameterSpec iv = new IvParameterSpec(vectorKey.getBytes());
//初始化,此方法可以采用三种方式,按加密算法要求来添加。
// (1)无第三个参数
// (2)第三个参数为SecureRandom random = new SecureRandom();中random对象,随机数。(AES不可采用这种方法)
// (3)采用此代码中的IVParameterSpec
cipher.init(Cipher.ENCRYPT_MODE, secretKey, iv);
//加密操作,返回加密后的字节数组,然后需要编码。主要编解码方式有Base64, HEX, UUE,7bit等等。此处看服务器需要什么编码方式
byte[] encrypted = cipher.doFinal(content.getBytes(StandardCharsets.UTF_8));
return new String(Base64.encodeBase64(encrypted));
}

/**
* content: 解密内容(base64编码格式)
* slatKey: 加密时使用的盐,16位字符串
* vectorKey: 加密时使用的向量,16位字符串
*/
public static String decrypt(String base64Content, String slatKey, String vectorKey) throws Exception {
Cipher cipher = Cipher.getInstance(DEFAULT_CIPHER_ALGORITHM);
SecretKey secretKey = new SecretKeySpec(slatKey.getBytes(), KEY_ALGORITHM);
IvParameterSpec iv = new IvParameterSpec(vectorKey.getBytes());
//与加密时不同MODE:Cipher.DECRYPT_MODE
cipher.init(Cipher.DECRYPT_MODE, secretKey, iv);
// 将字符串转化为base64编码的字节数组
// 将base64编码的字节数组转化为在加密之后的字节数组
byte[] content = Base64.decodeBase64(base64Content.getBytes());
byte[] encrypted = cipher.doFinal(content);
return new String(encrypted, StandardCharsets.UTF_8);
}

/**
* 获取加密的密匙,传入的slatKey可以是任意长度的,作为SecureRandom的随机种子,
* 而在KeyGenerator初始化时设置密匙的长度128bit(16位byte)
*/
private static Key getSlatKey(String slatKey) throws Exception {
KeyGenerator kgen = KeyGenerator.getInstance("AES");
SecureRandom random = SecureRandom.getInstance("SHA1PRNG");
random.setSeed(slatKey.getBytes());
kgen.init(128, random);
Key key = kgen.generateKey();
return key;
}


public static String generateSalt() {
String pass = UUID.randomUUID().toString().replaceAll("-", "").substring(0, 16);
return pass;
}


/**
* 加密前:当我遇上你
* 加密后:Lv7B8Y4LnDX/zJp4RW8xXg==
* 解密后:当我遇上你
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception{

String slatKey = generateSalt();
String vectorKey = generateSalt();


String content = "当我遇上你";

// 加密
System.out.println("加密前:" + content);
String encrypt = encrypt(content, slatKey, vectorKey);

System.out.println("加密后:" + encrypt);

String decrypt = decrypt(encrypt, slatKey, vectorKey);
System.out.println("解密后:" + decrypt);
}

}

最后

本文到此结束,感谢阅读。如果您觉得不错,请关注公众号【当我遇上你】,您的支持是我写作的最大动力。