package com.monkeylessey.framework.service.cipher;
|
|
import org.springframework.stereotype.Service;
|
|
import javax.crypto.BadPaddingException;
|
import javax.crypto.Cipher;
|
import javax.crypto.IllegalBlockSizeException;
|
import javax.crypto.NoSuchPaddingException;
|
import javax.crypto.spec.IvParameterSpec;
|
import javax.crypto.spec.SecretKeySpec;
|
import java.nio.charset.StandardCharsets;
|
import java.security.InvalidAlgorithmParameterException;
|
import java.security.InvalidKeyException;
|
import java.security.NoSuchAlgorithmException;
|
import java.util.Base64;
|
|
/**
|
* @author:xp
|
* @date:2023/12/4 13:10
|
*/
|
@Service("AESCipherService")
|
public class AESCipherService extends DefaultCipherService {
|
|
@Override
|
public String decodeImpl(String cipherText) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidAlgorithmParameterException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException {
|
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
|
SecretKeySpec keySpec = new SecretKeySpec(getKey().getBytes(StandardCharsets.UTF_8), "AES");
|
IvParameterSpec ivSpec = new IvParameterSpec(getIv().getBytes(StandardCharsets.UTF_8));
|
// 指定算法器做解密操作
|
cipher.init(Cipher.DECRYPT_MODE, keySpec, ivSpec);
|
byte[] decryptedBytes = cipher.doFinal(Base64.getDecoder().decode(cipherText));
|
return new String(decryptedBytes, StandardCharsets.UTF_8);
|
}
|
|
@Override
|
public String encodeImpl(String plainText) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidAlgorithmParameterException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException {
|
// 密文算法器(我瞎定义的),指定需要的算法
|
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
|
// 获取密钥对象
|
SecretKeySpec keySpec = new SecretKeySpec(getKey().getBytes(StandardCharsets.UTF_8), "AES");
|
// 获取增强随机对象
|
IvParameterSpec ivSpec = new IvParameterSpec(getIv().getBytes(StandardCharsets.UTF_8));
|
// 初始化算法器,第一个参数指定算法器做加密操作
|
cipher.init(Cipher.ENCRYPT_MODE, keySpec, ivSpec);
|
// 加密
|
byte[] encryptedBytes = cipher.doFinal(plainText.getBytes(StandardCharsets.UTF_8));
|
// 将加密结果使用Base64编码可传给前端,使用Base64是因为默认的结果是乱码(结果就这样并不是有问题)的,编码后更清晰
|
return Base64.getEncoder().encodeToString(encryptedBytes);
|
}
|
}
|