前言
实际工作中做了一个请求API的服务,在请求第三方API时需要配置是否对请求内容进行加密,需求要求的加密的算法为AES,DES,DES3。
可以使用Java自带的加解密工具类来实现
代码
加解密算法枚举类
enum EncryptType {
DES(1, "DES", 56),
AES(2, "AES", 128),
DES3(3, "DESede", 168);
static {
map = Arrays.stream(values()).collect(toMap(EncryptUtils.EncryptType::getValue, e -> e));
}
private final Integer value;
private final String desc;
private final Integer keySize;
private static final Map<Integer, EncryptUtils.EncryptType> map;
EncryptType(Integer value, String desc, Integer keySize) {
this.value = value;
this.desc = desc;
this.keySize = keySize;
}
public Integer getValue() {
return this.value;
}
public String getDesc() {
return this.desc;
}
public Integer getKeySize() {
return keySize;
}
public static EncryptUtils.EncryptType getEncryptType(Integer value) {
return map.getOrDefault(value, DES);
}
}
加解密工具类
/**
* 加密算法:DES AES DESede
* 加密模式:ECB CBC CTR OFB CFB
* 填充方式:PKCS5Padding PKCS7Padding
*/
public class EncryptUtils {
/**
* 通用加密方法
*
* @param encryptType 加密算法
* @param encryptString 加密算法/加密模式/填充方式
* @param encryptKey 密钥
* @param content 明文
* @return 密文
*/
public static String encrypt(Integer encryptType, String encryptString, String encryptKey, String content) {
try {
EncryptType type = EncryptType.getEncryptType(encryptType);
KeyGenerator kgen = KeyGenerator.getInstance(type.getDesc());
SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
secureRandom.setSeed(encryptKey.getBytes());
kgen.init(type.getKeySize(), secureRandom);
SecretKey secretKey = kgen.generateKey();
// 生成实例(加解密算法/工作方式/填充方式)
Cipher cipher = Cipher.getInstance(encryptString);
// (模式(加密模式),转换的key)
cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(secretKey.getEncoded(), type.getDesc()));
// 加密
byte[] bytes = cipher.doFinal(content.getBytes());
return Base64.getEncoder().encodeToString(bytes);
} catch (NoSuchAlgorithmException | NoSuchPaddingException | InvalidKeyException |
IllegalBlockSizeException | BadPaddingException e) {
throw new RuntimeException(e);
}
}
/**
* 通用加密方法
*
* @param encryptType 加密算法
* @param encryptString 加密算法/加密模式/填充方式
* @param encryptKey 密钥
* @param content 密文
* @return 明文
*/
public static String decrypt(Integer encryptType, String encryptString, String encryptKey, String content) {
try {
EncryptType type = EncryptType.getEncryptType(encryptType);
KeyGenerator kgen = KeyGenerator.getInstance(type.getDesc());
SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
secureRandom.setSeed(encryptKey.getBytes());
kgen.init(type.getKeySize(), secureRandom);
SecretKey secretKey = kgen.generateKey();
// 生成实例(加解密算法/工作方式/填充方式)
Cipher cipher = Cipher.getInstance(encryptString);
// (模式(解密模式),转换的key)
cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(secretKey.getEncoded(), type.getDesc()));
// 解密
byte[] bytes = cipher.doFinal(Base64.getDecoder().decode(content));
return new String(bytes);
} catch (NoSuchAlgorithmException | NoSuchPaddingException | InvalidKeyException |
IllegalBlockSizeException | BadPaddingException e) {
throw new RuntimeException(e);
}
}
}
测试类
class EncryptUtilsTest {
@Test
void encrypt() {
String encryptKey = "123456789123456789123456789123456789";
String content = "qwertyuiopasdfgghjklzxcvvbnm";
String encryptString = "DES/ECB/PKCS5Padding";
String encode = EncryptUtils.encrypt(DES.getValue(), encryptString, encryptKey, content);
System.out.println(encode);
String decode = EncryptUtils.decrypt(DES.getValue(), encryptString, encryptKey, encode);
System.out.println(decode);
encryptString = "AES/ECB/PKCS5Padding";
encode = EncryptUtils.encrypt(AES.getValue(), encryptString, encryptKey, content);
System.out.println(encode);
decode = EncryptUtils.decrypt(AES.getValue(), encryptString, encryptKey, encode);
System.out.println(decode);
encryptString = "DESede/ECB/PKCS5Padding";
encode = EncryptUtils.encrypt(DES3.getValue(), encryptString, encryptKey, content);
System.out.println(encode);
decode = EncryptUtils.decrypt(DES3.getValue(), encryptString, encryptKey, encode);
System.out.println(decode);
}
}
文章介绍了如何在Java中使用内置工具类实现AES、DES和DES3的加解密功能,包括加密算法的选择、参数设置以及提供了一个测试类进行实例演示。
&spm=1001.2101.3001.5002&articleId=136294072&d=1&t=3&u=5a9001b8046545c9bbb7881b53d65981)
4310

被折叠的 条评论
为什么被折叠?



