package com.malk.lianan; import cn.hutool.core.codec.Base64; import cn.hutool.crypto.Mode; import cn.hutool.crypto.Padding; import cn.hutool.crypto.symmetric.AES; import java.nio.charset.StandardCharsets; import java.util.Arrays; public class AesUtil { /** * AES CBC 加密 * @param content 明文内容 * @param key 密钥(需要16/24/32字节) * @return Base64编码的密文 */ public static String encrypt(String content, String key) { // 1. 创建AES对象,指定CBC模式,PKCS5Padding填充 AES aes = new AES(Mode.CBC, Padding.PKCS5Padding, key.getBytes(StandardCharsets.UTF_8)); // 2. 设置IV(这里使用密钥的前16字节,但实际应该用随机IV) // 注意:实际项目中IV应该是随机的,每次加密都不同 byte[] ivBytes = key.getBytes(StandardCharsets.UTF_8); if (ivBytes.length > 16) { ivBytes = Arrays.copyOf(ivBytes, 16); } else if (ivBytes.length < 16) { // 填充到16字节 ivBytes = Arrays.copyOf(ivBytes, 16); Arrays.fill(ivBytes, ivBytes.length, 16, (byte)0); } aes.setIv(ivBytes); // 3. 加密并返回Base64 byte[] encrypted = aes.encrypt(content, StandardCharsets.UTF_8); return Base64.encode(encrypted); } /** * 解密 */ public static String decrypt(String base64Content, String key) { AES aes = new AES(Mode.CBC, Padding.PKCS5Padding, key.getBytes(StandardCharsets.UTF_8)); byte[] ivBytes = key.getBytes(StandardCharsets.UTF_8); if (ivBytes.length > 16) { ivBytes = Arrays.copyOf(ivBytes, 16); } else if (ivBytes.length < 16) { ivBytes = Arrays.copyOf(ivBytes, 16); Arrays.fill(ivBytes, ivBytes.length, 16, (byte)0); } aes.setIv(ivBytes); byte[] decoded = Base64.decode(base64Content); return aes.decryptStr(decoded, StandardCharsets.UTF_8); } }