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

相关推荐
Sylvia-girl2 小时前
Java——抽象类
java·开发语言
Yana.nice4 小时前
Bash函数详解
开发语言·chrome·bash
Touper.5 小时前
Redis 基础详细介绍(Redis简单介绍,命令行客户端,Redis 命令,Java客户端)
java·数据库·redis
m0_535064605 小时前
C++模版编程:类模版与继承
java·jvm·c++
虾条_花吹雪6 小时前
Using Spring for Apache Pulsar:Message Production
java·ai·中间件
tomorrow.hello6 小时前
Java并发测试工具
java·开发语言·测试工具
Moso_Rx6 小时前
javaEE——synchronized关键字
java·java-ee
晓13136 小时前
JavaScript加强篇——第四章 日期对象与DOM节点(基础)
开发语言·前端·javascript
老胖闲聊6 小时前
Python I/O 库【输入输出】全面详解
开发语言·python
张小洛6 小时前
Spring AOP 是如何生效的(入口源码级解析)?
java·后端·spring