java开发之AES加密和解密

本文主要讲解AES的加密和解密

一.AES简介

  • AES是高级加密标准,即Advanced Encryption Standard,它是一种对称加密方式(加密和解密使用相同密钥的加密算法).
  • AES算法流程是:加密端使用相同的密钥明文进行加密解密端使用相同的密钥密文进行解密.
    加密端 ——>明文 ——>密钥——>密文
    解密端 ——>密文 ——>密钥——>明文
  • AES是分组密码加密方式,它把明文按组区分,进行加密,密钥的长度可以使用128位、192位或256位,以下示例采用128位的方式生成密钥

二.AES加解密过程

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
/**
* 生成密钥
*
* @param key 根据Key生成密钥
* @return 字符串格式的密钥
*/
public static String generaterKey(String key) {
try {
// 创建AES密码器
KeyGenerator keygen = KeyGenerator.getInstance("AES");
// 获取安全随机数
SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
// 根据加密key的字节数组设置安全随机数的种子
secureRandom.setSeed(key.getBytes());
// 根据安全随机数初始化128位的密码器
keygen.init(128, secureRandom);
// 密码器生成密钥
SecretKey secretKey = keygen.generateKey();
// 密钥的字节数组
byte[] secretKeyBytes = secretKey.getEncoded();
// base64编码,密钥转为字符串
String secretKeyStr = Base64.getEncoder().encodeToString(secretKeyBytes);
return secretKeyStr;
} catch (Exception e) {
return null;
}
}

2.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
/**
* 加密
*
* @param content 需要加密的内容
* @param secretKey 字符串格式的密钥
* @return 加密后的字符串
*/
public static String encrypt(String content, String secretKey) {
try {
// 密钥base64解码
byte[] secretKeyBytes = Base64.getDecoder().decode(secretKey);
// AES专用密钥
Key aesKey = new SecretKeySpec(secretKeyBytes, "AES");
// 创建密码器
Cipher cipher = Cipher.getInstance("AES");
// 初始化密码器
cipher.init(Cipher.ENCRYPT_MODE, aesKey);
// 加密
byte[] secretBytes = cipher.doFinal(content.getBytes("UTF-8"));
// base64编码,加密内容转为字符串
String result = Base64.getEncoder().encodeToString(secretBytes);
return result;
} catch (Exception e) {
return null;
}
}

3.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
/**
* 解密
*
* @param content 解密的串
* @param secretKey 字符串格式的密钥
* @return 解密后的字符串
*/
public static String decrypt(String content, String secretKey) {
try {
// 密钥base64解码
byte[] secretKeyBytes = Base64.getDecoder().decode(secretKey);
// AES专用密钥
Key aesKey = new SecretKeySpec(secretKeyBytes, "AES");
// 创建密码器
Cipher cipher = Cipher.getInstance("AES");
// 初始化密码器
cipher.init(Cipher.DECRYPT_MODE, aesKey);
// base64解码,加密内容转为字节数组
byte[] contentBytes = Base64.getDecoder().decode(content);
// 解密
byte[] result = cipher.doFinal(contentBytes);
return new String(result);
} catch (Exception e) {
return null;
}
}

三.测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public static void main(String[] args) {
String key = "hk5s2j45sks";
String content = "This is AES 加密算法";
System.out.println("要加密的数据:---------" + content);
// 根据key生成AES的key
String adeKey = generaterKey(key);
System.out.println("生成AES的Key:---------" + adeKey);
// 加密
String enResult = encrypt(content, adeKey);
System.out.println("加密后的数据:---------" + enResult);
// 解密
String deResult = decrypt(enResult, adeKey);
System.out.println("解密后的数据:---------" + deResult);
}

四.结果

1
2
3
4
要加密的数据:---------This is AES 加密算法
生成AES的Key:---------UhBgiiJ5MtnceUAkw5AWFA==
加密后的数据:---------P8ObKesBAj30B6SGYUtK7kBUJodFg/dq2RJBnPIRbxE=
解密后的数据:---------This is AES 加密算法