0%

AES对称加密

文章字数:370,阅读全文大约需要1分钟

AES对称加密安全性好,加密速度快。

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
import java.nio.charset.StandardCharsets;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.util.Base64;
import java.util.logging.Level;
import java.util.logging.Logger;

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;

public class AESUtil {

/** key长度 */
private static final int KEY_SIZE = 256;
/** 算法名 */
private static final String KEY_ALGORITHM = "AES";
/** 默认的加密算法及模式 */
private static final String DEFAULT_CIPHER_ALGORITHM = "AES/ECB/PKCS5Padding";

/**
* AES 加密操作
*
* @param byteContent
* 待加密内容
* @param key
* 加密密钥
* @return 加密数据
*/
public static byte[] encrypt(byte[] byteContent, byte[] key) {
try {
// 创建密码器
Cipher cipher = Cipher.getInstance(DEFAULT_CIPHER_ALGORITHM);
// 初始化为加密模式的密码器
cipher.init(Cipher.ENCRYPT_MODE, getSecretKey(key));
// 加密
return cipher.doFinal(byteContent);
} catch (Exception ex) {
Logger.getLogger(AESUtil.class.getName()).log(Level.SEVERE, null, ex);
}
return null;
}

/**
* AES 加密操作,返回Base64字符串
*
* @param byteContent
* 待加密内容
* @param key
* 加密密钥
* @return Base64转码后的加密数据
*/
public static String base64Encrypt(byte[] byteContent, byte[] key) {
byte[] encrypt = encrypt(byteContent, key);
if (encrypt != null) {
return Base64.getEncoder().encodeToString(encrypt);
}
return null;
}

/**
* AES 解密操作
*
* @param content
* 密文
* @param key
* 秘钥
* @return 解密后的数据
*/
public static byte[] decrypt(byte[] content, byte[] key) {
try {
// 实例化
Cipher cipher = Cipher.getInstance(DEFAULT_CIPHER_ALGORITHM);
// 使用密钥初始化,设置为解密模式
cipher.init(Cipher.DECRYPT_MODE, getSecretKey(key));
// 执行操作
return cipher.doFinal(content);
} catch (Exception ex) {
Logger.getLogger(AESUtil.class.getName()).log(Level.SEVERE, null, ex);
}
return null;
}

/**
* AES 解密操作
*
* @param content
* base64形式的密文
* @param key
* 秘钥
* @return 解密后的数据
*/
public static byte[] decrypt(String content, byte[] key) {
if (content != null) {
byte[] decode = Base64.getDecoder().decode(content);
return decrypt(decode, key);
}
return null;
}

/**
* 生成加密秘钥
*
* @return 生成指定算法密钥生成器的 KeyGenerator 对象
*/
private static SecretKeySpec getSecretKey(final byte[] key) {
KeyGenerator kg;
try {
kg = KeyGenerator.getInstance(KEY_ALGORITHM);
kg.init(KEY_SIZE, new SecureRandom(key));
// 生成一个密钥
SecretKey secretKey = kg.generateKey();
// 转换为AES专用密钥
return new SecretKeySpec(secretKey.getEncoded(), KEY_ALGORITHM);
} catch (NoSuchAlgorithmException ex) {
Logger.getLogger(AESUtil.class.getName()).log(Level.SEVERE, null, ex);
}
return null;
}

public static void main(String[] args) {
String content = "123在下面的文本框内输入需要处理abc";
String key = "个8ga10bg105*()_^%fag1啥干-0人48时阿嘎多沟沟壑壑ssssdca";
System.out.println("原文:" + content);
String s1 = AESUtil.base64Encrypt(content.getBytes(StandardCharsets.UTF_8), key.getBytes());
System.out.println("密文:" + s1);
System.out.println("解密:" + new String(AESUtil.decrypt(s1, key.getBytes()), StandardCharsets.UTF_8));
}
}