欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時間:2025年01月09日 09:33:45   作者:@井九  
這篇文章主要介紹了Java中的AES加密算法用法的相關(guān)資料,AES是一種廣泛使用的對稱加密算法,支持128位、192位和256位密鑰,文中通過代碼介紹的非常詳細,需要的朋友可以參考下

AES(Advanced Encryption Standard)是目前廣泛使用的一種對稱加密算法。它的加密速度快、強度高,被廣泛應(yīng)用于文件加密、傳輸加密等領(lǐng)域。本文將帶你一步一步了解 Java 中的 AES 加密,包括 分組模式(Block Mode) 和 填充方式(Padding) 的概念,并結(jié)合代碼示例說明其使用。

一、AES 基本概念

AES 是對稱加密算法,這意味著加密和解密使用同一個密鑰。AES 支持三種密鑰長度:128 位、192 位 和 256 位。AES 是基于 分組加密(Block Cipher) 的算法,每次加密固定長度的明文塊(通常是 128 位,即 16 字節(jié)),如果明文不足 16 字節(jié),需要進行填充(Padding)。

二、分組模式和填充方式

1. 分組模式(Block Cipher Mode)

AES 是分組加密算法,每次只能加密一個固定長度的塊,為了加密長度不定的明文,需要采用不同的分組模式。常見的分組模式包括:

  • ECB(Electronic Codebook)模式:每個明文塊獨立加密。這種方式簡單,但是安全性較低,因為相同的明文塊會得到相同的密文塊,容易被攻擊。
  • CBC(Cipher Block Chaining)模式:每個明文塊在加密前先與前一個密文塊進行異或操作。需要一個初始向量(IV)來確保每次加密得到不同的密文。
  • CFB(Cipher Feedback)模式:將前一密文塊作為輸入生成偽隨機數(shù)流,然后與明文塊異或得到密文塊。
  • OFB(Output Feedback)模式:與 CFB 類似,但它將上一次的輸出反饋作為下一次加密輸入,而不是使用密文塊。
  • CTR(Counter)模式:將一個計數(shù)器的輸出作為輸入來生成偽隨機數(shù)流,與明文塊異或,屬于流模式加密。

其中,CBC 模式CTR 模式比較常用,因為它們提供了更好的安全性。

2. 填充方式(Padding)

AES 的分組長度是固定的 128 位(16 字節(jié)),但實際明文長度往往不是 16 字節(jié)的倍數(shù),因此需要填充。常見的填充方式有:

  • PKCS5Padding:最常用的填充方式,填充的每個字節(jié)的值為剩余填充的字節(jié)數(shù)。
  • PKCS7Padding:與 PKCS5Padding 類似,但可以用于大于 8 字節(jié)分組的加密算法。
  • NoPadding:不進行填充,但要求輸入的明文長度必須是分組大小的整數(shù)倍。

三、Java 實現(xiàn) AES 加密

接下來,我們通過 Java 代碼來實現(xiàn) AES 加密,結(jié)合不同的 分組模式 和 填充方式 進行示例。

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 模式下,相同的明文塊會產(chǎn)生相同的密文塊,容易被攻擊,因此不推薦使用。

2. AES-CBC 模式

CBC 模式相對更安全,它使用了初始向量(IV)來確保加密結(jié)果的隨機性。以下是 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 模式是一種流模式加密,它將計數(shù)器作為輸入,加密后生成密鑰流,再與明文異或得到密文。以下是示例:

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();

        // 隨機生成計數(shù)器 (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 模式的優(yōu)點在于,它不需要填充,因為每個明文字節(jié)都直接與偽隨機密鑰流異或。

四、總結(jié)

在 Java 中,使用 AES 加密時,需要考慮以下幾點:

  • 分組模式:不同的分組模式?jīng)Q定了 AES 的安全性和效率。CBC 和 CTR 模式是比較推薦的安全選項,而 ECB 模式由于容易遭受攻擊,應(yīng)盡量避免使用。
  • 填充方式:明文的長度如果不是 16 字節(jié)的整數(shù)倍,需要使用填充方式。PKCS5Padding 是最常見的選擇,而 NoPadding 適用于流模式(如 CTR 模式)加密。
  • 密鑰長度:AES 支持 128 位、192 位、256 位的密鑰長度,通常 128 位密鑰已經(jīng)足夠安全,而 256 位密鑰提供了更高的安全保障。

使用 AES 加密時,一定要謹慎選擇分組模式和填充方式,確保安全性和兼容性。希望通過本文,你對 Java 中的 AES 加密有了更深入的了解。

到此這篇關(guān)于Java中的AES加密算法用法的文章就介紹到這了,更多相關(guān)Java中AES加密詳解內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java數(shù)據(jù)結(jié)構(gòu)之優(yōu)先級隊列(PriorityQueue)用法詳解

    Java數(shù)據(jù)結(jié)構(gòu)之優(yōu)先級隊列(PriorityQueue)用法詳解

    優(yōu)先級隊列是一種先進先出的數(shù)據(jù)結(jié)構(gòu),操作的數(shù)據(jù)帶有優(yōu)先級,這種數(shù)據(jù)結(jié)構(gòu)就是優(yōu)先級隊列(PriorityQueue)。本文將詳細講講Java優(yōu)先級隊列的用法,感興趣的可以了解一下
    2022-07-07
  • 詳解Java的MyBatis框架中的事務(wù)處理

    詳解Java的MyBatis框架中的事務(wù)處理

    利用MyBatis框架的配置管理比直接使用JDBC API編寫事務(wù)控制要來得更加輕松,這里我們就來詳解Java的MyBatis框架中的事務(wù)處理,尤其是和Spring框架集成后更加exciting
    2016-06-06
  • HashSet和TreeSet使用方法的區(qū)別解析

    HashSet和TreeSet使用方法的區(qū)別解析

    這篇文章主要介紹了HashSet和TreeSet使用方法的區(qū)別解析,具有一定借鑒價值,需要的朋友可以參考下
    2018-01-01
  • spring-boot-starter-thymeleaf加載外部html文件方式

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

    本文介紹了在SpringMVC中使用Thymeleaf模板引擎加載外部HTML文件的方法,以及在Spring Boot中使用Thymeleaf的基本步驟,包括引入依賴、創(chuàng)建Controller、創(chuàng)建HTML文件、參數(shù)化訪問、熱加載和熱更新文件
    2025-02-02
  • Spring實現(xiàn)IoC和DI的方法詳解

    Spring實現(xiàn)IoC和DI的方法詳解

    IoC全稱Inversion of Control (控制反轉(zhuǎn)) ,這里的控制其實是控制權(quán)的意思,可以理解為對象的獲取權(quán)力和方式發(fā)生了發(fā)轉(zhuǎn),DI依賴注?是?個過程,是指IoC容器在創(chuàng)建Bean時, 去提供運?時所依賴的資源,?資源指的就是對象,本文介紹了Spring實現(xiàn)IoC和DI的方法
    2024-08-08
  • Java定時任務(wù)schedule和scheduleAtFixedRate的異同

    Java定時任務(wù)schedule和scheduleAtFixedRate的異同

    本文主要介紹了Java定時任務(wù)schedule和scheduleAtFixedRate的異同,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-05-05
  • Spring Security 實現(xiàn)“記住我”功能及原理解析

    Spring Security 實現(xiàn)“記住我”功能及原理解析

    這篇文章主要介紹了Spring Security 實現(xiàn)“記住我”功能及原理解析,需要的朋友可以參考下
    2020-05-05
  • 詳解spring cloud hystrix 請求合并collapsing

    詳解spring cloud hystrix 請求合并collapsing

    這篇文章主要介紹了詳解spring cloud hystrix 請求合并collapsing,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-05-05
  • MyBatis插入數(shù)據(jù)返回主鍵的介紹

    MyBatis插入數(shù)據(jù)返回主鍵的介紹

    今天小編就為大家分享一篇關(guān)于MyBatis插入數(shù)據(jù)返回主鍵的介紹,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-01-01
  • 簡單了解Java編程中拋出異常的方法

    簡單了解Java編程中拋出異常的方法

    這篇文章主要介紹了Java編程中拋出異常的方法,是Java入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下
    2015-11-11

最新評論