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,这样解密时可以轻松去除填充部分。

相关推荐
老王熬夜敲代码1 分钟前
C++的decltype
开发语言·c++·笔记
益达3213 分钟前
IDEA 整合 Git 版本控制:提交、分支管理与冲突解决实操
java·intellij-idea
lxp1997414 分钟前
PHP框架自带队列--更新中
开发语言·php
MoonBit月兔5 分钟前
海外开发者实践分享:用 MoonBit 开发 SQLC 插件(其三)
java·开发语言·数据库·redis·rust·编程·moonbit
问道飞鱼6 分钟前
【Rust编程知识】在 Windows 下搭建完整的 Rust 开发环境
开发语言·windows·后端·rust·开发环境
天呐草莓10 分钟前
企业微信运维手册
java·运维·网络·python·微信小程序·企业微信·微信开放平台
jllllyuz10 分钟前
C# 面向对象图书管理系统
android·开发语言·c#
小兔崽子去哪了11 分钟前
Java 登录专题
java·spring boot·后端
毕设源码-邱学长11 分钟前
【开题答辩全过程】以 高校跨校选课系统为例,包含答辩的问题和答案
java·eclipse
wuguan_13 分钟前
C#文件读取
开发语言·c#·数据读写