128 lines
3.8 KiB
Java
128 lines
3.8 KiB
Java
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);
|
||
}
|
||
|
||
}
|
||
|