AES加解密工具类

本文介绍了Java中用于加密的AES工具类,包括加密和解密的使用方法。加密后的结果通常需要进行Base64编码,如果作为URL参数,还需要进行URI转换。

AES介绍
AES(Advanced Encryption Standard),高级加密标准.是java中常用的加密算法之一。

在线AES加密 | AES解密 - 在线工具

AESUtil Java AES 加密解密工具类

使用注意:

  1. 加密后通常配合 Base64 进行编码。 Base64编码
  2. 编码后若作为 URL 参数还需进行 URI 转换。url转码
package com.example.demo.util;

import org.springframework.util.Base64Utils;

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 * @description: AES加解密工具类
 * @create: 2020/05/14 21:34
 **/
public class AESUtil {
   
   

    /** 加密算法. */
    private static final String KEY_ALGORITHM = "AES";

    /** 加密器类型:加密算法AES/加密模式ECB/补码方式PKCS5Padding. */
    private static final String DEFAULT_CIPHER_ALGORITHM = "AES/ECB/PKCS5Padding";

    /** 字符编码. */
    private static final String CHARSET = "UTF-8";

    /** 密钥. */
    
<think>我们正在处理一个关于AES加解密工具类实现的问题。用户需要一段用于AES加密和解密的代码实现。根据引用内容,我们需要注意以下几点:1.密钥管理:不要硬编码密钥,应该安全地存储和检索密钥。2.模式和填充:建议明确指定模式和填充,例如使用AES/CBC/PKCS5Padding。3.初始化向量(IV):如果使用CBC模式,需要提供随机的IV,并且每个加密操作都使用唯一的IV。IV需要与加密数据一起存储或传输。4.字符编码:使用统一的字符编码(如UTF-8)。5.异常处理:需要仔细处理异常。因此,我们将编写一个AES工具类,包含以下功能:-支持AES/CBC/PKCS5Padding模式(这是一种常用且安全的模式)。-生成随机的IV,并将IV与加密后的数据一起返回(通常将IV放在加密数据的前面,因为IV的长度是固定的,16字节)。-提供加密和解密方法,输入和输出使用Base64编码,以便于处理字符串。设计:加密步骤:1.生成一个随机的IV(16字节)。2.使用密钥和IV初始化加密器。3.对明文进行加密,得到密文。4.将IV和密文拼接在一起(IV在前,密文在后),然后对整个结果进行Base64编码。解密步骤:1.将Base64字符串解码为字节数组。2.分离前16个字节作为IV,剩下的部分作为密文。3.使用密钥和IV初始化解密器。4.解密密文,得到明文。注意:密钥的长度应该是16字节(AES-128)、24字节(AES-192)或32字节(AES-256)。我们假设用户会提供符合要求的密钥。我们将使用Java来实现,因为引用中提到了Java。但注意用户并没有指定语言,不过根据引用内容,我们推断可能是Java。代码实现如下:</think>### AES加解密工具类实现 以下是基于JavaAES加解密工具类实现,采用CBC模式和PKCS5Padding填充方案,符合安全实践要求: ```java import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; import java.nio.charset.StandardCharsets; import java.util.Base64; public class AESUtil { private static final String ALGORITHM = "AES/CBC/PKCS5Padding"; private static final String CHARSET = "UTF-8"; /** * AES加密 * @param plainText 明文 * @param key 密钥(Base64编码) * @return 加密后的Base64字符串(包含IV) */ public static String encrypt(String plainText, String key) throws Exception { byte[] keyBytes = Base64.getDecoder().decode(key); SecretKeySpec secretKey = new SecretKeySpec(keyBytes, "AES"); // 生成随机IV byte[] ivBytes = new byte[16]; java.security.SecureRandom.getInstanceStrong().nextBytes(ivBytes); IvParameterSpec ivSpec = new IvParameterSpec(ivBytes); Cipher cipher = Cipher.getInstance(ALGORITHM); cipher.init(Cipher.ENCRYPT_MODE, secretKey, ivSpec); byte[] encrypted = cipher.doFinal(plainText.getBytes(CHARSET)); // 组合IV和密文 byte[] combined = new byte[ivBytes.length + encrypted.length]; System.arraycopy(ivBytes, 0, combined, 0, ivBytes.length); System.arraycopy(encrypted, 0, combined, ivBytes.length, encrypted.length); return Base64.getEncoder().encodeToString(combined); } /** * AES解密 * @param encryptedText 加密文本(Base64编码) * @param key 密钥(Base64编码) * @return 解密后的明文 */ public static String decrypt(String encryptedText, String key) throws Exception { byte[] keyBytes = Base64.getDecoder().decode(key); SecretKeySpec secretKey = new SecretKeySpec(keyBytes, "AES"); byte[] combined = Base64.getDecoder().decode(encryptedText); // 分离IV和密文 byte[] ivBytes = new byte[16]; byte[] encryptedBytes = new byte[combined.length - ivBytes.length]; System.arraycopy(combined, 0, ivBytes, 0, ivBytes.length); System.arraycopy(combined, ivBytes.length, encryptedBytes, 0, encryptedBytes.length); IvParameterSpec ivSpec = new IvParameterSpec(ivBytes); Cipher cipher = Cipher.getInstance(ALGORITHM); cipher.init(Cipher.DECRYPT_MODE, secretKey, ivSpec); byte[] decrypted = cipher.doFinal(encryptedBytes); return new String(decrypted, StandardCharsets.UTF_8); } } ``` ### 使用示例 ```java public class Main { public static void main(String[] args) { try { // 密钥(需为Base64编码) String key = "o91GjT9BsPn8iAuLwBRliA=="; String plainText = "Hello, World!"; // 加密 String encrypted = AESUtil.encrypt(plainText, key); System.out.println("加密结果: " + encrypted); // 解密 String decrypted = AESUtil.decrypt(encrypted, key); System.out.println("解密结果: " + decrypted); } catch (Exception e) { e.printStackTrace(); } } } ``` ### 关键安全实践 1. **密钥管理** - 避免硬编码密钥(示例仅为演示) - 使用安全存储方案(如密钥管理系统或硬件安全模块) 2. **初始化向量(IV)** - 每次加密生成随机IV(满足唯一性要求) - IV与密文一起存储传输(无需保密) 3. **加密配置** - 明确指定算法/模式/填充:`AES/CBC/PKCS5Padding` - 使用强随机数生成器:`SecureRandom.getInstanceStrong()` 4. **字符编码** - 统一使用UTF-8编码避免兼容问题 5. **异常处理** - 实际应用中需细化异常处理逻辑(如`InvalidKeyException`, `BadPaddingException`等) > 注意:CBC模式需确保每条消息使用唯一IV,如需更高级安全性可考虑GCM模式(支持认证加密)[^1]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值