最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

一、AES 基本概念

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

二、分組模式和填充方式

1. 分組模式(Block Cipher Mode)

AES 是分組加密算法,每次只能加密一個(gè)固定長(zhǎng)度的塊,為了加密長(zhǎng)度不定的明文,需要采用不同的分組模式。常見(jiàn)的分組模式包括:

  • ECB(Electronic Codebook)模式:每個(gè)明文塊獨(dú)立加密。這種方式簡(jiǎn)單,但是安全性較低,因?yàn)橄嗤拿魑膲K會(huì)得到相同的密文塊,容易被攻擊。
  • CBC(Cipher Block Chaining)模式:每個(gè)明文塊在加密前先與前一個(gè)密文塊進(jìn)行異或操作。需要一個(gè)初始向量(IV)來(lái)確保每次加密得到不同的密文。
  • CFB(Cipher Feedback)模式:將前一密文塊作為輸入生成偽隨機(jī)數(shù)流,然后與明文塊異或得到密文塊。
  • OFB(Output Feedback)模式:與 CFB 類(lèi)似,但它將上一次的輸出反饋?zhàn)鳛橄乱淮渭用茌斎?,而不是使用密文塊。
  • CTR(Counter)模式:將一個(gè)計(jì)數(shù)器的輸出作為輸入來(lái)生成偽隨機(jī)數(shù)流,與明文塊異或,屬于流模式加密。

其中,CBC 模式CTR 模式比較常用,因?yàn)樗鼈兲峁┝烁玫陌踩浴?/p>

2. 填充方式(Padding)

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

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

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

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

1. AES-ECB 模式

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

2. AES-CBC 模式

CBC 模式相對(duì)更安全,它使用了初始向量(IV)來(lái)確保加密結(jié)果的隨機(jī)性。以下是 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();

        // 隨機(jī)生成 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),它確保每次加密同樣的明文時(shí),生成不同的密文塊,從而提升了安全性。

3. AES-CTR 模式

CTR 模式是一種流模式加密,它將計(jì)數(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();

        // 隨機(jī)生成計(jì)數(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)點(diǎn)在于,它不需要填充,因?yàn)槊總€(gè)明文字節(jié)都直接與偽隨機(jī)密鑰流異或。

四、總結(jié)

在 Java 中,使用 AES 加密時(shí),需要考慮以下幾點(diǎn):

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

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

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

相關(guān)文章

  • 詳解Java的JDBC中Statement與PreparedStatement對(duì)象

    詳解Java的JDBC中Statement與PreparedStatement對(duì)象

    這篇文章主要介紹了詳解Java的JDBC中Statement與PreparedStatement對(duì)象,PreparedStatement一般來(lái)說(shuō)比使用Statement效率更高,需要的朋友可以參考下
    2015-12-12
  • Java中對(duì)于并發(fā)問(wèn)題的處理思路分享

    Java中對(duì)于并發(fā)問(wèn)題的處理思路分享

    并發(fā)粗暴的解釋就是一段代碼,在同一時(shí)間段內(nèi),被多個(gè)線程同時(shí)處理的情況就是并發(fā)現(xiàn)象。這篇文章和大家分享了一些對(duì)于并發(fā)問(wèn)題的處理思路,需要的可以參考一下
    2023-02-02
  • SpringBoot動(dòng)態(tài)Feign服務(wù)調(diào)用詳解

    SpringBoot動(dòng)態(tài)Feign服務(wù)調(diào)用詳解

    Feign是Netflix公司開(kāi)發(fā)的一個(gè)聲明式的REST調(diào)用客戶端; Ribbon負(fù)載均衡、 Hystrⅸ服務(wù)熔斷是我們Spring Cloud中進(jìn)行微服務(wù)開(kāi)發(fā)非?;A(chǔ)的組件,在使用的過(guò)程中我們也發(fā)現(xiàn)它們一般都是同時(shí)出現(xiàn)的,而且配置也都非常相似
    2022-12-12
  • Python中scrapy框架的ltem和scrapy.Request詳解

    Python中scrapy框架的ltem和scrapy.Request詳解

    這篇文章主要介紹了Python中scrapy框架的ltem和scrapy.Request詳解,Item是保存爬取數(shù)據(jù)的容器,它的使用方法和字典類(lèi)似,不過(guò),相比字典,Item提供了額外的保護(hù)機(jī)制,可以避免拼寫(xiě)錯(cuò)誤或者定義字段錯(cuò)誤,需要的朋友可以參考下
    2023-09-09
  • 聊聊java中一些減少if else 的編碼習(xí)慣的方法

    聊聊java中一些減少if else 的編碼習(xí)慣的方法

    這篇文章主要介紹了聊聊java中一些減少if else 的編碼習(xí)慣的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • SpringBoot使用工具類(lèi)實(shí)現(xiàn)獲取容器中的Bean

    SpringBoot使用工具類(lèi)實(shí)現(xiàn)獲取容器中的Bean

    這篇文章主要為大家詳細(xì)介紹了SpringBoot如何使用工具類(lèi)實(shí)現(xiàn)獲取容器中的Bean,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-03-03
  • 基于Java實(shí)現(xiàn)考試管理系統(tǒng)

    基于Java實(shí)現(xiàn)考試管理系統(tǒng)

    這篇文章主要介紹了基于Java實(shí)現(xiàn)的考試管理系統(tǒng),項(xiàng)目運(yùn)用到的技術(shù)有Springboot、Maven、Jpa、Vue等等,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2021-12-12
  • logback的ShutdownHook關(guān)閉原理解析

    logback的ShutdownHook關(guān)閉原理解析

    這篇文章主要為大家介紹了logback的ShutdownHook關(guān)閉原理源碼解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-11-11
  • 詳解SimpleDateFormat的線程安全問(wèn)題與解決方案

    詳解SimpleDateFormat的線程安全問(wèn)題與解決方案

    這篇文章主要介紹了SimpleDateFormat的線程安全問(wèn)題與解決方案,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2017-03-03
  • 在AOP中Spring生成代理類(lèi)的兩種方式

    在AOP中Spring生成代理類(lèi)的兩種方式

    今天小編就為大家分享一篇關(guān)于在AOP中Spring生成代理類(lèi)的兩種方式,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-01-01

最新評(píng)論

涿鹿县| 碌曲县| 土默特左旗| 蒙阴县| 景泰县| 珲春市| 富宁县| 绥江县| 富蕴县| 娄底市| 勐海县| 福清市| 韶关市| 神农架林区| 房产| 海盐县| 平山县| 绥宁县| 夏津县| 隆德县| 泌阳县| 呼和浩特市| 易门县| 夏津县| 蒙城县| 房产| 安西县| 临桂县| 泗洪县| 准格尔旗| 鹤庆县| 荔波县| 北川| 枣强县| 富阳市| 平远县| 梁平县| 双柏县| 涞源县| 故城县| 临泽县|