Java中的AES加密算法用法示例详解

 更新时间:2025年01月09日 09:33:45   作者:@井九  
这篇文章主要介绍了Java中的AES加密算法用法的相关资料,AES是一种广泛使用的对称加密算法,支持128位、192位和256位密钥,文中通过代码介绍的非常详细,需要的朋友可以参考下

AES(Advanced Encryption Standard)是目前广泛使用的一种对称加密算法。它的加密速度快、强度高,被广泛应用于文件加密、传输加密等领域。本文将带你一步一步了解 Java 中的 AES 加密,包括 分组模式(Block Mode) 和 填充方式(Padding) 的概念,并结合代码示例说明其使用。

一、AES 基本概念

AES 是对称加密算法,这意味着加密和解密使用同一个密钥。AES 支持三种密钥长度:128 位192 位 和 256 位。AES 是基于 分组加密(Block Cipher) 的算法,每次加密固定长度的明文块(通常是 128 位,即 16 字节),如果明文不足 16 字节,需要进行填充(Padding)

二、分组模式和填充方式

1. 分组模式(Block Cipher Mode)

AES 是分组加密算法,每次只能加密一个固定长度的块,为了加密长度不定的明文,需要采用不同的分组模式。常见的分组模式包括:

  • ECB(Electronic Codebook)模式:每个明文块独立加密。这种方式简单,但是安全性较低,因为相同的明文块会得到相同的密文块,容易被攻击。
  • CBC(Cipher Block Chaining)模式:每个明文块在加密前先与前一个密文块进行异或操作。需要一个初始向量(IV)来确保每次加密得到不同的密文。
  • CFB(Cipher Feedback)模式:将前一密文块作为输入生成伪随机数流,然后与明文块异或得到密文块。
  • OFB(Output Feedback)模式:与 CFB 类似,但它将上一次的输出反馈作为下一次加密输入,而不是使用密文块。
  • CTR(Counter)模式:将一个计数器的输出作为输入来生成伪随机数流,与明文块异或,属于流模式加密。

其中,CBC 模式CTR 模式比较常用,因为它们提供了更好的安全性。

2. 填充方式(Padding)

AES 的分组长度是固定的 128 位(16 字节),但实际明文长度往往不是 16 字节的倍数,因此需要填充。常见的填充方式有:

  • PKCS5Padding:最常用的填充方式,填充的每个字节的值为剩余填充的字节数。
  • PKCS7Padding:与 PKCS5Padding 类似,但可以用于大于 8 字节分组的加密算法。
  • NoPadding:不进行填充,但要求输入的明文长度必须是分组大小的整数倍。

三、Java 实现 AES 加密

接下来,我们通过 Java 代码来实现 AES 加密,结合不同的 分组模式 和 填充方式 进行示例。

1. AES-ECB 模式

ECB 模式是最简单的 AES 加密方式,代码如下:

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import java.util.Base64;

public class AesEcbExample {
    public static void main(String[] args) throws Exception {
        // 生成 AES 密钥
        KeyGenerator keyGen = KeyGenerator.getInstance("AES");
        keyGen.init(128); // 选择 AES-128
        SecretKey secretKey = keyGen.generateKey();

        // 初始化加密器,指定 AES/ECB/PKCS5Padding
        Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
        cipher.init(Cipher.ENCRYPT_MODE, secretKey);

        // 加密
        String plaintext = "Hello AES in ECB mode";
        byte[] encrypted = cipher.doFinal(plaintext.getBytes());

        // 输出密文(Base64 编码)
        System.out.println("加密后的密文:" + Base64.getEncoder().encodeToString(encrypted));
    }
}

在 ECB 模式下,相同的明文块会产生相同的密文块,容易被攻击,因此不推荐使用。

2. AES-CBC 模式

CBC 模式相对更安全,它使用了初始向量(IV)来确保加密结果的随机性。以下是 CBC 模式的示例:

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

public class AesCbcExample {
    public static void main(String[] args) throws Exception {
        // 生成 AES 密钥
        KeyGenerator keyGen = KeyGenerator.getInstance("AES");
        keyGen.init(128); 
        SecretKey secretKey = keyGen.generateKey();

        // 随机生成 IV
        byte[] iv = new byte[16];
        IvParameterSpec ivSpec = new IvParameterSpec(iv);

        // 初始化加密器,指定 AES/CBC/PKCS5Padding
        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
        cipher.init(Cipher.ENCRYPT_MODE, secretKey, ivSpec);

        // 加密
        String plaintext = "Hello AES in CBC mode";
        byte[] encrypted = cipher.doFinal(plaintext.getBytes());

        // 输出密文(Base64 编码)
        System.out.println("加密后的密文:" + Base64.getEncoder().encodeToString(encrypted));
    }
}

CBC 模式需要初始向量(IV),它确保每次加密同样的明文时,生成不同的密文块,从而提升了安全性。

3. AES-CTR 模式

CTR 模式是一种流模式加密,它将计数器作为输入,加密后生成密钥流,再与明文异或得到密文。以下是示例:

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

public class AesCtrExample {
    public static void main(String[] args) throws Exception {
        // 生成 AES 密钥
        KeyGenerator keyGen = KeyGenerator.getInstance("AES");
        keyGen.init(128); 
        SecretKey secretKey = keyGen.generateKey();

        // 随机生成计数器 (IV)
        byte[] iv = new byte[16];
        IvParameterSpec ivSpec = new IvParameterSpec(iv);

        // 初始化加密器,指定 AES/CTR/NoPadding
        Cipher cipher = Cipher.getInstance("AES/CTR/NoPadding");
        cipher.init(Cipher.ENCRYPT_MODE, secretKey, ivSpec);

        // 加密
        String plaintext = "Hello AES in CTR mode";
        byte[] encrypted = cipher.doFinal(plaintext.getBytes());

        // 输出密文(Base64 编码)
        System.out.println("加密后的密文:" + Base64.getEncoder().encodeToString(encrypted));
    }
}

CTR 模式的优点在于,它不需要填充,因为每个明文字节都直接与伪随机密钥流异或。

四、总结

在 Java 中,使用 AES 加密时,需要考虑以下几点:

  • 分组模式:不同的分组模式决定了 AES 的安全性和效率。CBC 和 CTR 模式是比较推荐的安全选项,而 ECB 模式由于容易遭受攻击,应尽量避免使用。
  • 填充方式:明文的长度如果不是 16 字节的整数倍,需要使用填充方式。PKCS5Padding 是最常见的选择,而 NoPadding 适用于流模式(如 CTR 模式)加密。
  • 密钥长度:AES 支持 128 位、192 位、256 位的密钥长度,通常 128 位密钥已经足够安全,而 256 位密钥提供了更高的安全保障。

使用 AES 加密时,一定要谨慎选择分组模式和填充方式,确保安全性和兼容性。希望通过本文,你对 Java 中的 AES 加密有了更深入的了解。

到此这篇关于Java中的AES加密算法用法的文章就介绍到这了,更多相关Java中AES加密详解内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java数据结构之优先级队列(PriorityQueue)用法详解

    Java数据结构之优先级队列(PriorityQueue)用法详解

    优先级队列是一种先进先出的数据结构,操作的数据带有优先级,这种数据结构就是优先级队列(PriorityQueue)。本文将详细讲讲Java优先级队列的用法,感兴趣的可以了解一下
    2022-07-07
  • 详解Java的MyBatis框架中的事务处理

    详解Java的MyBatis框架中的事务处理

    利用MyBatis框架的配置管理比直接使用JDBC API编写事务控制要来得更加轻松,这里我们就来详解Java的MyBatis框架中的事务处理,尤其是和Spring框架集成后更加exciting
    2016-06-06
  • HashSet和TreeSet使用方法的区别解析

    HashSet和TreeSet使用方法的区别解析

    这篇文章主要介绍了HashSet和TreeSet使用方法的区别解析,具有一定借鉴价值,需要的朋友可以参考下
    2018-01-01
  • spring-boot-starter-thymeleaf加载外部html文件方式

    spring-boot-starter-thymeleaf加载外部html文件方式

    本文介绍了在SpringMVC中使用Thymeleaf模板引擎加载外部HTML文件的方法,以及在Spring Boot中使用Thymeleaf的基本步骤,包括引入依赖、创建Controller、创建HTML文件、参数化访问、热加载和热更新文件
    2025-02-02
  • Spring实现IoC和DI的方法详解

    Spring实现IoC和DI的方法详解

    IoC全称Inversion of Control (控制反转) ,这里的控制其实是控制权的意思,可以理解为对象的获取权力和方式发生了发转,DI依赖注⼊是⼀个过程,是指IoC容器在创建Bean时, 去提供运⾏时所依赖的资源,⽽资源指的就是对象,本文介绍了Spring实现IoC和DI的方法
    2024-08-08
  • Java定时任务schedule和scheduleAtFixedRate的异同

    Java定时任务schedule和scheduleAtFixedRate的异同

    本文主要介绍了Java定时任务schedule和scheduleAtFixedRate的异同,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-05-05
  • Spring Security 实现“记住我”功能及原理解析

    Spring Security 实现“记住我”功能及原理解析

    这篇文章主要介绍了Spring Security 实现“记住我”功能及原理解析,需要的朋友可以参考下
    2020-05-05
  • 详解spring cloud hystrix 请求合并collapsing

    详解spring cloud hystrix 请求合并collapsing

    这篇文章主要介绍了详解spring cloud hystrix 请求合并collapsing,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-05-05
  • MyBatis插入数据返回主键的介绍

    MyBatis插入数据返回主键的介绍

    今天小编就为大家分享一篇关于MyBatis插入数据返回主键的介绍,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-01-01
  • 简单了解Java编程中抛出异常的方法

    简单了解Java编程中抛出异常的方法

    这篇文章主要介绍了Java编程中抛出异常的方法,是Java入门学习中的基础知识,需要的朋友可以参考下
    2015-11-11

最新评论