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); } }