跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Javajava算法

Java AES 加密算法实现与模式详解

综述由AI生成Java AES 加密算法实现涉及多种工作模式。文章展示了 ECB、CBC 及 NoPadding 模式的代码示例,涵盖密钥生成、初始化向量设置及加解密流程。重点说明了不同填充方式对数据长度的要求,特别是 NoPadding 模式下需满足 16 字节倍数限制。通过 Hex 编码传输密钥,演示了客户端与服务端的安全通信场景。代码包含完整类结构,便于开发者直接参考集成。

星星泡饭发布于 2025/2/23更新于 2026/5/2126 浏览
Java AES 加密算法实现与模式详解

Java AES 加密算法实现与模式详解

import java.util.Arrays;  
import javax.crypto.Cipher;  
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;  
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;

import org.apache.shiro.codec.Hex;  

/** 
 * AES 算法 对称加密,密码学中的高级加密标准 2005 年成为有效标准  
 */  
public class AES {  
    static Cipher cipher;  
    static final String KEY_ALGORITHM = "AES";  
    static final String CIPHER_ALGORITHM_ECB = "AES/ECB/PKCS5Padding";  
    /* 
     *  
     */  
    static final String CIPHER_ALGORITHM_CBC = "AES/CBC/PKCS5Padding";  
    /*  
     * AES/CBC/NoPadding 要求 
     * 密钥必须是 16 位的;Initialization vector (IV) 必须是 16 位 
     * 待加密内容的长度必须是 16 的倍数,如果不是 16 的倍数,就会出如下异常: 
     * javax.crypto.IllegalBlockSizeException: Input length not multiple of 16 bytes 
     *  
     *  由于固定了位数,所以对于被加密数据有中文的,加、解密不完整 
     *   
     *  可 以看到,在原始数据长度为 16 的整数 n 倍时,假如原始数据长度等于 16*n,则使用 NoPadding 时加密后数据长度等于 16*n, 
     *  其它情况下加密数据长 度等于 16*(n+1)。在不足 16 的整数倍的情况下,假如原始数据长度等于 16*n+m[其中 m 小于 16], 
     *  除了 NoPadding 填充之外的任何方 式,加密数据长度都等于 16*(n+1). 
     */  
    static final String CIPHER_ALGORITHM_CBC_NoPadding = "AES/CBC/NoPadding";   
          
    static SecretKey secretKey;  
            
    public static void main(String[] args) throws Exception {  
        //testAES("qwertyu");   
    }  
        
    /** 
     * 使用 AES 算法 加密,默认模式  AES/ECB 
     */  
    static void method1(String str) throws Exception {  
        cipher = Cipher.getInstance(KEY_ALGORITHM);  
        //KeyGenerator 生成 aes 算法密钥  
        secretKey = KeyGenerator.getInstance(KEY_ALGORITHM).generateKey();  
        System.out.println("服务器端生成密钥的为:" + secretKey.getEncoded());  
        byte[] keyBytes = secretKey.getEncoded();
        
        
        //客户端通过密钥进行加密数据
        secretKey = new SecretKeySpec(keyBytes, KEY_ALGORITHM);
        cipher.init(Cipher.ENCRYPT_MODE, secretKey);//使用加密模式初始化 密钥  
        byte[] encrypt = cipher.doFinal(str.getBytes()); //按单部分操作加密或解密数据,或者结束一个多部分操作。  
        System.out.println("客户端加密后:" + Arrays.toString(encrypt));  
        
        //服务器端解密
        secretKey = new SecretKeySpec(keyBytes, KEY_ALGORITHM);
        cipher.init(Cipher.DECRYPT_MODE, secretKey);//使用解密模式初始化 密钥  
        byte[] decrypt = cipher.doFinal(encrypt);  
        System.out.println("服务器端解密后:" + new String(decrypt));  
          
    }  
    
    /**
     * 实战场景:客户端发送加密数据,服务端解密数据
     * @param content
     * @throws Exception
     */
    public static void testAES(String content) throws Exception {
	//服务器端生成密钥
	Cipher serverCiper = Cipher.getInstance("AES");
	SecretKey serverSecretKey = KeyGenerator.getInstance("AES").generateKey();
	byte[] keyBytes = serverSecretKey.getEncoded();
	String keyStr = Hex.encodeToString(keyBytes);//密钥给到客户端
	System.out.println("密钥为:"+keyStr);
	
	//客户端加密数据发送到服务端
	SecretKey clientSecretKey = new SecretKeySpec(Hex.decode(keyStr), "AES");
	Cipher clientCiper = Cipher.getInstance("AES");
	clientCiper.init(Cipher.ENCRYPT_MODE, clientSecretKey);
	String encryptStr = Hex.encodeToString(clientCiper.doFinal(content.getBytes()));
	System.out.println("客户端加密后数据:"+encryptStr);
	
	//服务器接收到客户端数据进行解密
	serverCiper.init(Cipher.DECRYPT_MODE, serverSecretKey);
	byte[] decodeBytes = serverCiper.doFinal(Hex.decode(encryptStr));
        System.out.println("服务器解密后数据:"+new String(decodeBytes));
	
    }
      
    /** 
     * 使用 AES 算法 加密,默认模式 AES/ECB/PKCS5Padding 
     */  
    static void method2(String str) throws Exception {  
        cipher = Cipher.getInstance(CIPHER_ALGORITHM_ECB);  
        //KeyGenerator 生成 aes 算法密钥  
        secretKey = KeyGenerator.getInstance(KEY_ALGORITHM).generateKey();  
        System.out.println("密钥的长度为:" + secretKey.getEncoded().length);  
          
        cipher.init(Cipher.ENCRYPT_MODE, secretKey);//使用加密模式初始化 密钥  
        byte[] encrypt = cipher.doFinal(str.getBytes()); //按单部分操作加密或解密数据,或者结束一个多部分操作。  
          
        System.out.println("method2-加密:" + Arrays.toString(encrypt));  
        cipher.init(Cipher.DECRYPT_MODE, secretKey);//使用解密模式初始化 密钥  
        byte[] decrypt = cipher.doFinal(encrypt);  
        System.out.println("method2-解密后:" + new String(decrypt));  
          
    }  
      
    static byte[] getIV() {  
        String iv = "1234567812345678"; //IV length: must be 16 bytes long  
        return iv.getBytes();  
    }  
      
    /** 
     * 使用 AES 算法 加密,默认模式 AES/CBC/PKCS5Padding 
     */  
    static void method3(String str) throws Exception {  
        cipher = Cipher.getInstance(CIPHER_ALGORITHM_CBC);  
        //KeyGenerator 生成 aes 算法密钥  
        secretKey = KeyGenerator.getInstance(KEY_ALGORITHM).generateKey();  
        System.out.println("密钥的长度为:" + secretKey.getEncoded().length);  
          
        cipher.init(Cipher.ENCRYPT_MODE, secretKey, new IvParameterSpec(getIV()));//使用加密模式初始化 密钥  
        byte[] encrypt = cipher.doFinal(str.getBytes()); //按单部分操作加密或解密数据,或者结束一个多部分操作。  
          
        System.out.println("method3-加密:" + Arrays.toString(encrypt));  
        cipher.init(Cipher.DECRYPT_MODE, secretKey, new IvParameterSpec(getIV()));//使用解密模式初始化 密钥  
        byte[] decrypt = cipher.doFinal(encrypt);  
        System.out.println("method3-解密后:" + new String(decrypt));  
          
    }  
      
    /** 
     * 使用 AES 算法 加密,默认模式 AES/CBC/NoPadding  参见上面对于这种 mode 的数据限制 
     */  
    static void method4(String str) throws Exception {  
        cipher = Cipher.getInstance(CIPHER_ALGORITHM_CBC_NoPadding);  
        //KeyGenerator 生成 aes 算法密钥  
        secretKey = KeyGenerator.getInstance(KEY_ALGORITHM).generateKey();  
        System.out.println("密钥的长度为:" + secretKey.getEncoded().length);  
          
        cipher.init(Cipher.ENCRYPT_MODE, secretKey, new IvParameterSpec(getIV()));//使用加密模式初始化 密钥  
        byte[] encrypt = cipher.doFinal(str.getBytes(), 0, str.length()); //按单部分操作加密或解密数据,或者结束一个多部分操作。  
          
        System.out.println("method4-加密:" + Arrays.toString(encrypt));  
        cipher.init(Cipher.DECRYPT_MODE, secretKey, new IvParameterSpec(getIV()));//使用解密模式初始化 密钥  
        byte[] decrypt = cipher.doFinal(encrypt);  
          
        System.out.println("method4-解密后:" + new String(decrypt));  
          
    }  
      
}

目录

  1. Java AES 加密算法实现与模式详解
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • C++ 使用 OMPL 库实现 RRT*与 Informed RRT*路径规划对比
  • Python 美学的三重奏:列表、字典与生成器推导式详解
  • 自然语言处理高级应用与前沿技术实战
  • OpenClaw 本地优先 AI 智能体部署与使用指南
  • 从零开始:OpenClaw安装+飞书机器人全流程配置指南(附踩坑实录)
  • Git 使用指南:从安装到连接 GitHub
  • VSCode Copilot 插件卡顿问题解决方案
  • CentOS 下五种 Python 定时发送邮件方案实战
  • JVM 内存模型详解:运行时数据区结构解析
  • Vue 项目前端国际化 i18n 实现指南
  • VibeThinker-1.5B:轻量模型如何实现高阶推理突破
  • cocotb平台用VCS仿Xilinx FPGA
  • Android 开发中 Cursor AI 配置与实践技巧
  • Python 网络爬虫基础与通用模板实现
  • 深入理解 Python 对象模型:一切皆对象的底层逻辑
  • 企业投融资模式与法律风险分析
  • ASR 自动语音识别原理与 Whisper 模型详解
  • Python FastAPI 入门实战:从环境搭建到核心功能
  • MonkeyCode 全流程 AI 编程协作工具技术解析
  • Llama-3.2-3B 部署优化:Ollama 上下文窗口与 Token 限制配置

相关免费在线工具

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online