对称加密工具 - SymmetricCrypto
# 对称加密工具 - SymmetricCrypto
简介
对称加密(也叫私钥加密)指的是加密和解密使用相同密钥的加密算法。这种加密方式在加密密钥和解密密钥之间可以互相推算,通常在对称算法中,加密密钥和解密密钥是相同的。因此,这种加密算法又被称为秘密密钥算法或单密钥算法。对称加密的安全性完全依赖于密钥的保密性,一旦密钥泄露,任何人都可以解密数据。因此,在安全通信中,密钥的保密性至关重要。
SymmetricCrypto
封装了 JDK 中支持的常见对称加密算法,如 AES、DES、Blowfish 等,并且可以轻松实现数据的加密和解密操作。
# 1. 通用使用
以 AES 算法为例,介绍 SymmetricCrypto
的基本使用。
# 示例:使用 AES 对称加密
import cn.hutool.crypto.SecureUtil;
import cn.hutool.crypto.symmetric.SymmetricCrypto;
import cn.hutool.crypto.symmetric.SymmetricAlgorithm;
import cn.hutool.core.util.CharsetUtil;
public class SymmetricCryptoExample {
public static void main(String[] args) {
// 待加密的明文
String content = "test中文";
// 随机生成 AES 密钥
byte[] key = SecureUtil.generateKey(SymmetricAlgorithm.AES.getValue()).getEncoded();
// 使用 AES 算法创建 SymmetricCrypto 对象
SymmetricCrypto aes = new SymmetricCrypto(SymmetricAlgorithm.AES, key);
// 加密
byte[] encrypt = aes.encrypt(content);
System.out.println("加密后的字节数组: " + new String(encrypt));
// 解密
byte[] decrypt = aes.decrypt(encrypt);
System.out.println("解密后的字节数组: " + new String(decrypt));
// 加密为十六进制字符串表示
String encryptHex = aes.encryptHex(content);
System.out.println("加密后的十六进制字符串: " + encryptHex);
// 解密为字符串
String decryptStr = aes.decryptStr(encryptHex, CharsetUtil.CHARSET_UTF_8);
System.out.println("解密后的字符串: " + decryptStr);
}
}
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
SecureUtil.generateKey(String algorithm)
:根据指定算法生成对称加密密钥。algorithm
:加密算法名称(如"AES"
、"DES"
等)。- 返回值:返回生成的密钥(
SecretKey
对象)。
new SymmetricCrypto(SymmetricAlgorithm algorithm, byte[] key)
:创建对称加密对象。algorithm
:使用的对称加密算法(如SymmetricAlgorithm.AES
)。key
:加密密钥字节数组。- 返回值:返回
SymmetricCrypto
对象,支持加密和解密操作。
encrypt(String data)
:加密字符串数据,返回字节数组。data
:待加密的字符串。- 返回值:返回加密后的字节数组。
decrypt(byte[] encryptedData)
:解密字节数组数据。encryptedData
:加密后的字节数组。- 返回值:返回解密后的字节数组。
encryptHex(String data)
:加密字符串数据,返回十六进制表示的字符串。data
:待加密的字符串。- 返回值:返回加密后的十六进制字符串。
decryptStr(String encryptedData, Charset charset)
:解密十六进制字符串数据。encryptedData
:加密后的十六进制字符串。charset
:解码使用的字符集。- 返回值:返回解密后的字符串。
作用: 对称加密适用于需要高效加密解密数据的场景,如文件加密、通信数据加密等。
实际开发场景: 在需要保护敏感信息(如用户密码、支付信息)的场景下,可以使用 AES 等对称加密算法进行加密存储和解密验证。
# 2. DESede 实现
DESede(又称 3DES)是一种在 DES 基础上进行了增强的对称加密算法。
# 示例:使用 DESede 对称加密
import cn.hutool.crypto.SecureUtil;
import cn.hutool.crypto.symmetric.SymmetricCrypto;
import cn.hutool.crypto.symmetric.SymmetricAlgorithm;
public class SymmetricCryptoExample {
public static void main(String[] args) {
// 待加密的明文
String content = "test中文";
// 生成 DESede 密钥
byte[] key = SecureUtil.generateKey(SymmetricAlgorithm.DESede.getValue()).getEncoded();
// 使用 DESede 算法创建 SymmetricCrypto 对象
SymmetricCrypto des = new SymmetricCrypto(SymmetricAlgorithm.DESede, key);
// 加密
byte[] encrypt = des.encrypt(content);
System.out.println("加密后的字节数组: " + new String(encrypt));
// 解密
byte[] decrypt = des.decrypt(encrypt);
System.out.println("解密后的字节数组: " + new String(decrypt));
// 加密为十六进制字符串表示
String encryptHex = des.encryptHex(content);
System.out.println("加密后的十六进制字符串: " + encryptHex);
// 解密为字符串
String decryptStr = des.decryptStr(encryptHex);
System.out.println("解密后的字符串: " + decryptStr);
}
}
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
new SymmetricCrypto(SymmetricAlgorithm algorithm, byte[] key)
:创建对称加密对象,支持 DESede 算法。algorithm
:使用的对称加密算法(如SymmetricAlgorithm.DESede
)。key
:加密密钥字节数组。
作用: DESede 适用于要求更高安全性的对称加密场景,如数据传输加密和数据库加密存储。
# 3. AES 封装
AES(高级加密标准)是对称加密算法中的一种常见且广泛应用的算法。Java 默认使用的 AES 模式是:AES/ECB/PKCS5Padding
。
# 示例 1:快速构建 AES 加密对象
import cn.hutool.crypto.SecureUtil;
import cn.hutool.crypto.symmetric.AES;
import cn.hutool.core.util.CharsetUtil;
public class SymmetricCryptoExample {
public static void main(String[] args) {
// 待加密的明文
String content = "test中文";
// 随机生成 AES 密钥
byte[] key = SecureUtil.generateKey(SymmetricAlgorithm.AES.getValue()).getEncoded();
// 使用 AES 算法创建 AES 对象
AES aes = SecureUtil.aes(key);
// 加密
byte[] encrypt = aes.encrypt(content);
System.out.println("加密后的字节数组: " + new String(encrypt));
// 解密
byte[] decrypt = aes.decrypt(encrypt);
System.out.println("解密后的字节数组: " + new String(decrypt));
// 加密为十六进制字符串表示
String encryptHex = aes.encryptHex(content);
System.out.println("加密后的十六进制字符串: " + encryptHex);
// 解密为字符串
String decryptStr = aes.decryptStr(encryptHex, CharsetUtil.CHARSET_UTF_8);
System.out.println("解密后的字符串: " + decryptStr);
}
}
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
SecureUtil.aes(byte[] key)
:使用自定义密钥生成 AES 加密对象。key
:自定义密钥字节数组。- 返回值:返回
AES
对象,支持加密和解密操作。
作用: AES 是目前使用最广泛的对称加密算法,适用于各种数据加密场景。
# 示例 2:自定义 AES 模式和偏移量
import cn.hutool.crypto.symmetric.AES;
import cn.hutool.crypto.Mode;
import cn.hutool.crypto.Padding;
public class SymmetricCryptoExample {
public static void main(String[] args) {
// 自定义 AES 模式和偏移量
AES aes = new AES(Mode.CTS, Padding.PKCS5Padding, "0CoJUm6Qyw8W8jud".getBytes(), "0102030405060708".getBytes());
// 加密为十六进制字符串表示
String encryptHex = aes.encryptHex("test中文");
System.out.println("加密后的十六进制字符串: " + encryptHex);
// 解密为字符串
String decryptStr = aes.decryptStr(encryptHex);
System.out.println("解密后的字符串: " + decryptStr);
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
new AES(Mode mode, Padding padding, byte[] key, byte[] iv)
:
创建支持自定义模式和偏移量的 AES 加密对象。
mode
:加密模式(如Mode.CTS
)。padding
:填充方式(如Padding.PKCS5Padding
)。key
:加密密钥。iv
:初始向量(偏移量)。
作用: 自定义 AES 模式和偏移量,适用于特定需求的加密场景。
# 4. DES 封装
DES(数据加密标准)是一种使用密钥加密的块加密算法,Java 中默认实现为:DES/CBC/PKCS5Padding
。
# 示例:使用 DES 对称加密
import cn.hutool.crypto.SecureUtil;
import cn.hutool.crypto.symmetric.DES;
import cn.hutool.crypto.symmetric.SymmetricAlgorithm;
public class SymmetricCryptoExample {
public static void main(String[] args) {
// 生成 DES 密钥
byte[] key = SecureUtil.generateKey(SymmetricAlgorithm.DES.getValue()).getEncoded();
// 使用 DES 算法创建 DES 对象
DES des = SecureUtil.des(key);
// 加密为十六进制字符串表示
String encryptHex = des.encryptHex("test中文");
System.out.println("加密后的十六进制字符串: " + encryptHex);
// 解密为字符串
String decryptStr = des.decryptStr(encryptHex);
System.out.println("解密后的字符串: " + decryptStr);
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
SecureUtil.des(byte[] key)
:使用自定义密钥生成 DES 加密对象。key
:自定义密钥字节数组。- 返回值:返回
DES
对象,支持加密和解密操作。
作用: DES 是一种经典的对称加密算法,适用于对数据安全性要求不高的加密场景。
# 5. SM4 国密算法
SM4 是中国自主研发的对称加密算法,广泛应用于金融、政务等领域。
# 示例:使用 SM4 对称加密
import cn.hutool.crypto.SmUtil;
import cn.hutool.crypto.symmetric.SymmetricCrypto;
import cn.hutool.core.util.CharsetUtil;
public class SymmetricCryptoExample {
public static void main(String[] args) {
// 使用 SM4 算法创建 SymmetricCrypto 对象
SymmetricCrypto sm4 = SmUtil.sm4();
// 待加密的内容
String content = "test中文";
// 加密为十六进制字符串表示
String encryptHex = sm4.encryptHex(content);
System.out.println("加密后的十六进制字符串: " + encryptHex);
// 解密为字符串
String decryptStr = sm4.decryptStr(encryptHex, CharsetUtil.CHARSET_UTF_8);
System.out.println("解密后的字符串: " + decryptStr);
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
SmUtil.sm4()
:生成 SM4 对称加密对象。- 返回值:返回
SymmetricCrypto
对象,支持加密和解密操作。
- 返回值:返回
作用: SM4 是国内广泛使用的对称加密算法,符合国家标准,适用于高安全性的加密需求。
# 示例:自定义 SM4 模式和偏移量
import cn.hutool.crypto.symmetric.SymmetricCrypto;
import cn.hutool.core.util.CharsetUtil;
public class SymmetricCryptoExample {
public static void main(String[] args) {
// 自定义 SM4 模式和偏移量
SymmetricCrypto sm4 = new SymmetricCrypto("SM4/ECB/PKCS5Padding");
// 待加密的内容
String content = "test中文";
// 加密为十六进制字符串表示
String encryptHex = sm4.encryptHex(content);
System.out.println("加密后的十六进制字符串: " + encryptHex);
// 解密为字符串
String decryptStr = sm4.decryptStr(encryptHex, CharsetUtil.CHARSET_UTF_8);
System.out.println("解密后的字符串: " + decryptStr);
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
new SymmetricCrypto(String algorithm)
:使用指定算法创建加密对象。algorithm
:算法名称(如"SM4/ECB/PKCS5Padding"
)。- 返回值:返回
SymmetricCrypto
对象,支持加密和解密操作。
作用: 适用于国密算法要求的加密场景,如金融系统中数据加密和存储。