Java AES加密工具类

以下是一个简单的AES加密示例

java 复制代码
import org.apache.commons.codec.binary.Base64;

import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;

/**
 * @author Sakura
 * @date 2023/8/16 14:54
 * @Description 测试网站 http://tool.chacuo.net/cryptaes
 */
public class AESUtil {

    private static final String KEY_ALGORITHM = "AES";
    private static final String DEFAULT_CIPHER_ALGORITHM  = "AES/ECB/PKCS5Padding";

    /**
     * @param content 待加密字符串
     * @param salt 加密盐
     * @return
     */
    public static String encrypt(String content, String salt) {
        try {
            //获得密码的字节数组
            byte[] raw = salt.getBytes();
            //根据密码生成AES密钥
            SecretKeySpec skey = new SecretKeySpec(raw, KEY_ALGORITHM);
            //根据指定算法ALGORITHM自成密码器
            Cipher cipher = Cipher.getInstance(DEFAULT_CIPHER_ALGORITHM);
            //初始化密码器,第一个参数为加密(ENCRYPT_MODE)或者解密(DECRYPT_MODE)操作,第二个参数为生成的AES密钥 16位
            cipher.init(Cipher.ENCRYPT_MODE, skey);
            //获取加密内容的字节数组(设置为utf-8)不然内容中如果有中文和英文混合中文就会解密为乱码
            byte [] byte_content = content.getBytes("utf-8");
            //密码器加密数据
            byte [] encode_content = cipher.doFinal(byte_content);
            //将加密后的数据转换为Base64编码的字符串返回
            return Base64.encodeBase64String(encode_content);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    /**
     * @param content 待解密字符串
     * @param salt 解密盐
     * @return
     */
    public static String decrypt(String content, String salt) {
        try {
            //获得密码的字节数组
            byte[] raw = salt.getBytes();
            //根据密码生成AES密钥
            SecretKeySpec skey = new SecretKeySpec(raw, KEY_ALGORITHM);
            //根据指定算法ALGORITHM自成密码器
            Cipher cipher = Cipher.getInstance(DEFAULT_CIPHER_ALGORITHM);
            //初始化密码器,第一个参数为加密(ENCRYPT_MODE)或者解密(DECRYPT_MODE)操作,第二个参数为生成的AES密钥
            cipher.init(Cipher.DECRYPT_MODE, skey);
            //把密文字符串Base64转回密文字节数组
            byte [] encode_content = Base64.decodeBase64(content);
            //密码器解密数据
            byte [] byte_content = cipher.doFinal(encode_content);
            //将解密后的数据转换为字符串返回
            return new String(byte_content,"utf-8");
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    public static void main(String[] args) {
        String str = encrypt("13100000000", "1186738753e64f8cbc26857215ec934f");
        System.out.println(str);

        String str1 = decrypt("ppLyUqR9IbYueAvbNQbiaQ==", "1186738753e64f8cbc26857215ec934f");
        System.out.println(str1);

    }

}

在做AES加密的时候一定要注意private static final String DEFAULT_CIPHER_ALGORITHM = "AES/ECB/PKCS5Padding" 这个参数,很多时候前后端加密解密不一致都是这里配置不一致导致的

AES:

AES 是一种对称加密算法,使用相同的密钥进行加密和解密操作。

它是被广泛使用的加密标准,提供了高效且安全的数据加密。

ECB(Electronic Codebook Mode):

ECB 是最简单的加密模式,每个明文块独立加密成密文块。

缺点是相同的明文块会被加密成相同的密文块,容易受到模式分析攻击,因此不适合加密大数据或高安全性需求的场景。

举例来说,如果你加密的文本有很多重复的模式,使用 ECB 模式会暴露这些重复模式的信息,降低安全性。

PKCS5Padding:

PKCS5Padding 是一种填充方式,用于将明文数据填充到符合块大小的倍数。

AES 是块加密算法,通常处理 16 字节(128 位)大小的块。如果明文数据不是 16 字节的倍数,就需要进行填充。

PKCS5Padding 会根据需要填充的字节数,用相应的字节值进行填充。例如,如果需要填充 5 个字节,则填充值是 0x05,这样解密时可以轻松去除填充部分。

相关推荐
摇滚侠33 分钟前
《On Java 中文版 基础卷》阅读笔记 对象无处不在 03
java·笔记·python
二十雨辰1 小时前
[学成在线]-01项目背景
java
小小小小钰儿1 小时前
1.5-Python网络编程
开发语言·网络·python·web安全·计算机·网络安全
hiahiahia1231 小时前
实现完整 Tool Dispatcher
开发语言·前端
AC赳赳老秦2 小时前
公开音频转写信息提取:OpenClaw 处理发布会与听证会文本并提取核心决策信息
大数据·开发语言·汇编·数据库·人工智能·deepseek·openclaw
弈栈录2 小时前
Java AI 应用的异步化与高并发设计
java·后端·架构
@yanyu6662 小时前
C编译器安装与第一个C程序
c语言·开发语言
落魄实习生2 小时前
Agent Scope Java 2.x 系列【2】 ReActAgent
java·开发语言
智鸟科技GemeOpen开发者智能设备2 小时前
智能插座二次开发如何接入Home Assistant,从零开始完整工程实现(Python+React)
开发语言·python·物联网·react.js·智能家居