common-module/utils/AESPKCS7PaddingUtils.java
cuijiawang ea58e018b4 init
2025-05-27 17:58:49 +08:00

128 lines
3.8 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package com.sgcc.utils;
import ch.qos.logback.core.boolex.EvaluationException;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.codec.binary.Base64;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.security.Security;
/**
* AES加密/解密工具类
*
* @author zhaoyuanyuan
* @version 1.0.0
* @date 2024/11/22 14:03
*/
@Slf4j
public class AESPKCS7PaddingUtils {
/**
* 密钥算法
*/
private static final String KEY_ALGORITHM = "AES";
/**
* 加密/解密算法 / 工作模式 / 填充方式
* Java 6支持PKCS5Padding填充方式
* Bouncy Castle支持PKCS7Padding填充方式
*/
private static final String CIPHER_ALGORITHM = "AES/CBC/PKCS7Padding";
/**
* 偏移量只有CBC模式才需要
*/
private final static String ivParameter = "0000000000000000";
/**
* AES要求密钥长度为128位或192位或256位java默认限制AES密钥长度最多128位
*/
public static String secretKey = "";
/**
* 编码格式
*/
public static final String ENCODING = "utf-8";
static {
//如果是PKCS7Padding填充方式则必须加上下面这行
Security.addProvider(new BouncyCastleProvider());
}
/**
* AES加密
*
* @param source 源字符串
* @return {@code String }
* @author zhaoyuanyuan
* @date 2024/11/22 14:05
*/
public static String encrypt(String source) {
try {
byte[] sourceBytes = source.getBytes(ENCODING);
byte[] keyBytes = secretKey.getBytes(ENCODING);
Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM, "BC");
IvParameterSpec iv = new IvParameterSpec(ivParameter.getBytes(ENCODING));
cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(keyBytes, KEY_ALGORITHM),iv);
byte[] decrypted = cipher.doFinal(sourceBytes);
return Base64.encodeBase64String(decrypted);
} catch (Exception e) {
log.error(e.toString());
}
return null;
}
/**
* AES解密
*
* @param encryptStr 加密后的密文
* @return {@code String }
* @author zhaoyuanyuan
* @date 2024/11/22 14:05
*/
public static String decrypt(String encryptStr) {
try {
byte[] sourceBytes = Base64.decodeBase64(encryptStr);
byte[] keyBytes = secretKey.getBytes(ENCODING);
Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM, "BC");
IvParameterSpec iv = new IvParameterSpec(ivParameter.getBytes(ENCODING));
cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(keyBytes, KEY_ALGORITHM),iv);
byte[] decoded = cipher.doFinal(sourceBytes);
return new String(decoded, ENCODING);
} catch (Exception e) {
log.error(e.toString());
}
return null;
}
/**
* 校验密码
*
* @param inputPassword 输入密码
* @param password 数据库存储密码
* @return boolean
* @author zhaoyuanyuan
* @date 2024/11/23 09:40
*/
public static boolean validatePassword(String inputPassword, String password) {
if (decrypt(inputPassword).equals(decrypt(password))) {
return true;
}
return false;
}
public static void main(String[] args) throws Exception {
//加密
String enString = AESPKCS7PaddingUtils.encrypt("12345678");
System.out.println("加密后的字串是:" + enString);
// 解密
String DeString = AESPKCS7PaddingUtils.decrypt("wUpDBpZlm//omEBf20WCag==");
System.out.println("解密后的字串是:" + DeString);
}
}