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

java?AES加密/解密實(shí)現(xiàn)完整代碼(附帶源碼)

 更新時(shí)間:2025年04月30日 09:28:54   作者:Katie。  
這篇文章主要介紹了java?AES加密/解密實(shí)現(xiàn)的相關(guān)資料,包括AES加密算法的基本原理、Java加密API的使用方法以及項(xiàng)目實(shí)現(xiàn)的步驟和代碼示例,需要的朋友可以參考下

1. 項(xiàng)目背景與介紹

在數(shù)據(jù)傳輸和存儲(chǔ)過(guò)程中,保護(hù)敏感信息的安全性非常關(guān)鍵。AES(Advanced Encryption Standard,高級(jí)加密標(biāo)準(zhǔn))是一種廣泛使用的對(duì)稱(chēng)加密算法,具有高效、安全、易于實(shí)現(xiàn)等特點(diǎn)。由于 AES 使用同一個(gè)密鑰進(jìn)行加密和解密,因此密鑰的管理非常重要。

本項(xiàng)目將通過(guò) Java 內(nèi)置的加密 API(主要在 javax.crypto 包中提供)實(shí)現(xiàn) AES 加密與解密。示例中我們采用 AES/CBC/PKCS5Padding 模式,并使用一個(gè) 128 位(16 字節(jié))的密鑰和固定的初始向量(IV)。為了便于演示,本示例使用了固定的 IV,但在實(shí)際應(yīng)用中,建議使用隨機(jī) IV,并將 IV 與密文一起存儲(chǔ)或傳輸。

通過(guò)本項(xiàng)目,你將掌握如何使用 Java 進(jìn)行 AES 加密和解密操作,并了解如何對(duì)密鑰和初始向量進(jìn)行設(shè)置、Base64 編碼結(jié)果輸出等知識(shí)點(diǎn)。

2. 相關(guān)知識(shí)

2.1 AES 加密算法

  • 對(duì)稱(chēng)加密:AES 算法屬于對(duì)稱(chēng)加密算法,即加密和解密使用相同的密鑰。其優(yōu)點(diǎn)是速度快,適合大數(shù)據(jù)量加密;缺點(diǎn)是密鑰傳輸和管理存在一定風(fēng)險(xiǎn)。
  • 加密模式與填充方式:常用的模式有 ECB、CBC、CFB 等,本示例采用 CBC 模式。由于 AES 的塊大小為 16 字節(jié),當(dāng)明文長(zhǎng)度不是 16 字節(jié)的整數(shù)倍時(shí),需要采用填充方式,本示例采用 PKCS5Padding。
  • 初始向量(IV):在 CBC 模式下,初始向量用于增加加密隨機(jī)性,通常需要隨機(jī)生成并與密文一起存儲(chǔ)。但本示例為了簡(jiǎn)化演示,使用了固定的 IV(僅供學(xué)習(xí)參考)。

2.2 Java 加密 API

Java 提供了一整套加密相關(guān)的類(lèi):

  • Cipher:核心加密解密類(lèi),用于執(zhí)行加密和解密操作。
  • SecretKeySpec:將原始密鑰數(shù)據(jù)封裝為密鑰對(duì)象。
  • IvParameterSpec:封裝初始向量數(shù)據(jù)。
  • Base64:用于將二進(jìn)制數(shù)據(jù)轉(zhuǎn)換為可讀的字符串格式,便于傳輸和存儲(chǔ)。

3. 項(xiàng)目實(shí)現(xiàn)思路

本項(xiàng)目主要分為以下幾個(gè)步驟:

  • 準(zhǔn)備密鑰和初始向量定義 AES 加密所需的 128 位密鑰和 16 字節(jié)的初始向量(IV)。在實(shí)際應(yīng)用中,這些應(yīng)由安全隨機(jī)數(shù)生成器產(chǎn)生,并妥善管理。

  • 創(chuàng)建 Cipher 對(duì)象使用 Cipher.getInstance("AES/CBC/PKCS5Padding") 獲取 Cipher 對(duì)象,并分別用密鑰和 IV 初始化加密和解密模式。

  • 執(zhí)行加密和解密操作

    • 加密:將明文字符串轉(zhuǎn)換為字節(jié)數(shù)組,調(diào)用 doFinal() 方法獲得密文字節(jié)數(shù)組,再進(jìn)行 Base64 編碼。
    • 解密:將 Base64 解碼后的密文字節(jié)數(shù)組通過(guò) doFinal() 方法還原為明文字節(jié)數(shù)組,并轉(zhuǎn)換為字符串。
  • 整合代碼并測(cè)試將上述流程封裝到一個(gè) Java 類(lèi)中,在主函數(shù)中調(diào)用加密和解密方法,驗(yàn)證加解密是否正確。

4. 完整代碼實(shí)現(xiàn)

下面是一份完整的 Java 代碼示例,實(shí)現(xiàn)了 AES 加密與解密功能。代碼中附有詳細(xì)中文注釋?zhuān)阌诶斫饷總€(gè)步驟的實(shí)現(xiàn)細(xì)節(jié)。

import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import javax.crypto.spec.IvParameterSpec;
import java.util.Base64;

/**
 * AESEncryptionDemo 類(lèi)演示了如何使用 Java 實(shí)現(xiàn) AES 加密和解密。
 * 本示例使用 AES/CBC/PKCS5Padding 模式,密鑰和初始向量均為 16 字節(jié)(128 位)。
 * 注意:示例中使用固定 IV 僅供學(xué)習(xí),實(shí)際應(yīng)用中應(yīng)使用隨機(jī) IV 并與密文一起傳輸。
 */
public class AESEncryptionDemo {

    // AES 密鑰(16 字節(jié)):請(qǐng)確保密鑰足夠隨機(jī)和安全
    private static final String KEY = "0123456789abcdef";
    // 初始向量(IV,16 字節(jié)):實(shí)際應(yīng)用中應(yīng)隨機(jī)生成
    private static final String IV = "abcdefghijklmnop";
    // 指定加密算法和模式
    private static final String ALGORITHM = "AES/CBC/PKCS5Padding";

    /**
     * 對(duì)給定的明文進(jìn)行 AES 加密,并返回 Base64 編碼后的密文字符串。
     *
     * @param plainText 明文字符串
     * @return Base64 編碼后的密文字符串,如果加密過(guò)程中發(fā)生異常則返回 null
     */
    public static String encrypt(String plainText) {
        try {
            // 獲取 Cipher 實(shí)例,指定使用 AES/CBC/PKCS5Padding 模式
            Cipher cipher = Cipher.getInstance(ALGORITHM);
            // 構(gòu)造密鑰規(guī)范
            SecretKeySpec keySpec = new SecretKeySpec(KEY.getBytes("UTF-8"), "AES");
            // 構(gòu)造初始向量規(guī)范
            IvParameterSpec ivSpec = new IvParameterSpec(IV.getBytes("UTF-8"));
            // 初始化 Cipher 為加密模式
            cipher.init(Cipher.ENCRYPT_MODE, keySpec, ivSpec);
            // 對(duì)明文進(jìn)行加密
            byte[] encryptedBytes = cipher.doFinal(plainText.getBytes("UTF-8"));
            // 使用 Base64 對(duì)密文字節(jié)數(shù)組進(jìn)行編碼,返回字符串
            return Base64.getEncoder().encodeToString(encryptedBytes);
        } catch (Exception e) {
            // 捕獲異常并打印錯(cuò)誤信息
            e.printStackTrace();
            return null;
        }
    }

    /**
     * 對(duì)給定的 Base64 編碼密文進(jìn)行 AES 解密,還原出原始明文字符串。
     *
     * @param cipherText Base64 編碼后的密文字符串
     * @return 解密后的明文字符串,如果解密過(guò)程中發(fā)生異常則返回 null
     */
    public static String decrypt(String cipherText) {
        try {
            // 獲取 Cipher 實(shí)例,指定使用 AES/CBC/PKCS5Padding 模式
            Cipher cipher = Cipher.getInstance(ALGORITHM);
            // 構(gòu)造密鑰規(guī)范
            SecretKeySpec keySpec = new SecretKeySpec(KEY.getBytes("UTF-8"), "AES");
            // 構(gòu)造初始向量規(guī)范
            IvParameterSpec ivSpec = new IvParameterSpec(IV.getBytes("UTF-8"));
            // 初始化 Cipher 為解密模式
            cipher.init(Cipher.DECRYPT_MODE, keySpec, ivSpec);
            // 將 Base64 編碼的密文轉(zhuǎn)換為字節(jié)數(shù)組
            byte[] decodedBytes = Base64.getDecoder().decode(cipherText);
            // 對(duì)密文進(jìn)行解密
            byte[] decryptedBytes = cipher.doFinal(decodedBytes);
            // 將解密后的字節(jié)數(shù)組轉(zhuǎn)換為字符串
            return new String(decryptedBytes, "UTF-8");
        } catch (Exception e) {
            // 捕獲異常并打印錯(cuò)誤信息
            e.printStackTrace();
            return null;
        }
    }

    /**
     * 主函數(shù),演示 AES 加密和解密的完整流程。
     *
     * @param args 命令行參數(shù)(未使用)
     */
    public static void main(String[] args) {
        // 定義待加密的明文
        String plainText = "Hello, AES Encryption!";
        System.out.println("原始明文: " + plainText);

        // 對(duì)明文進(jìn)行加密
        String encryptedText = encrypt(plainText);
        System.out.println("加密后的密文 (Base64 編碼): " + encryptedText);

        // 對(duì)密文進(jìn)行解密
        String decryptedText = decrypt(encryptedText);
        System.out.println("解密后的明文: " + decryptedText);
    }
}

5. 代碼解讀

5.1 密鑰和初始向量設(shè)置

  • KEY 和 IV
    • 本示例中密鑰和初始向量均為固定字符串,長(zhǎng)度均為 16 字節(jié),適用于 AES-128。
    • 實(shí)際應(yīng)用中,應(yīng)使用安全隨機(jī)數(shù)生成密鑰和 IV,并對(duì) IV 進(jìn)行傳輸或存儲(chǔ)(例如,將 IV 附加在密文前)。

5.2 加密過(guò)程

  • Cipher 獲取與初始化使用 Cipher.getInstance("AES/CBC/PKCS5Padding") 獲取 Cipher 對(duì)象,并利用 SecretKeySpec 和 IvParameterSpec 初始化 Cipher 為加密模式。
  • 數(shù)據(jù)加密將明文轉(zhuǎn)換為字節(jié)數(shù)組后調(diào)用 doFinal() 方法進(jìn)行加密,生成密文字節(jié)數(shù)組;之后使用 Base64 編碼便于輸出和存儲(chǔ)。

5.3 解密過(guò)程

  • Cipher 初始化為解密模式同樣使用 SecretKeySpec 和 IvParameterSpec 初始化 Cipher 為解密模式。
  • 數(shù)據(jù)解密將 Base64 解碼后的密文字節(jié)數(shù)組傳入 doFinal() 方法進(jìn)行解密,還原出原始明文字節(jié)數(shù)組,再轉(zhuǎn)換為字符串。

5.4 異常處理

  • 在加密和解密過(guò)程中均使用 try-catch 捕獲可能出現(xiàn)的異常,并輸出堆棧信息,確保程序調(diào)試和排查問(wèn)題時(shí)能獲得足夠的信息。

6. 項(xiàng)目總結(jié)與展望

本項(xiàng)目通過(guò) Java 實(shí)現(xiàn)了 AES 加密和解密的基本流程,主要收獲和體會(huì)包括:

  • 掌握對(duì)稱(chēng)加密基本原理學(xué)習(xí)了如何使用同一密鑰對(duì)數(shù)據(jù)進(jìn)行加密和解密,并理解了 AES 加密中密鑰與初始向量的重要性。

  • 熟悉 Java 加密 API通過(guò) Cipher、SecretKeySpec、IvParameterSpec 等類(lèi)的使用,掌握了 Java 內(nèi)置加密工具的基本操作。

  • 安全性與實(shí)際應(yīng)用雖然本示例使用固定的 IV 僅供學(xué)習(xí),但在實(shí)際應(yīng)用中應(yīng)采用隨機(jī) IV 并妥善管理密鑰,確保數(shù)據(jù)加密安全性。

  • 擴(kuò)展與優(yōu)化方向

    • 可改進(jìn)為生成隨機(jī) IV,并將 IV 與密文組合(例如將 IV 前置于密文中一起傳輸)。
    • 可以使用更高位數(shù)的 AES 加密(如 AES-256),前提是環(huán)境支持。
    • 將加密/解密過(guò)程封裝為工具類(lèi),便于在實(shí)際項(xiàng)目中復(fù)用和集成。

總之,本項(xiàng)目為開(kāi)發(fā)者提供了一個(gè)簡(jiǎn)單、直觀的 AES 加密/解密示例,既有助于理解對(duì)稱(chēng)加密的基本流程,也為構(gòu)建實(shí)際安全通信系統(tǒng)提供了實(shí)踐基礎(chǔ)。希望這篇博客文章能為你在 Java 安全編程領(lǐng)域提供有價(jià)值的參考和啟發(fā)。

總結(jié)

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

相關(guān)文章

  • Spring-Security對(duì)HTTP相應(yīng)頭的安全支持方式

    Spring-Security對(duì)HTTP相應(yīng)頭的安全支持方式

    這篇文章主要介紹了Spring-Security對(duì)HTTP相應(yīng)頭的安全支持方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • java?Date獲取本月的開(kāi)始時(shí)間與結(jié)束時(shí)間

    java?Date獲取本月的開(kāi)始時(shí)間與結(jié)束時(shí)間

    這篇文章主要為大家介紹了java?Date獲取本月的開(kāi)始時(shí)間與結(jié)束時(shí)間示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪
    2023-05-05
  • 由淺入深快速掌握J(rèn)ava?數(shù)組的使用

    由淺入深快速掌握J(rèn)ava?數(shù)組的使用

    Java?數(shù)組?數(shù)組對(duì)于每一門(mén)編程語(yǔ)言來(lái)說(shuō)都是重要的數(shù)據(jù)結(jié)構(gòu)之一,當(dāng)然不同語(yǔ)言對(duì)數(shù)組的實(shí)現(xiàn)及處理也不盡相同。?Java?語(yǔ)言中提供的數(shù)組是用來(lái)存儲(chǔ)固定大小的同類(lèi)型元素
    2022-04-04
  • JDK17中Sealed Classes的使用

    JDK17中Sealed Classes的使用

    Sealed類(lèi)自JDK15起預(yù)覽,JDK17正式納入,通過(guò)sealed修飾限制繼承,指定允許的子類(lèi),并用final或non-sealed控制繼承層級(jí),實(shí)現(xiàn)更精確的類(lèi)繼承管理,下面就來(lái)介紹一下具體使用
    2025-08-08
  • 如何啟用?Java?AOT?編譯打包?Solon?項(xiàng)目(Solon?AOT)

    如何啟用?Java?AOT?編譯打包?Solon?項(xiàng)目(Solon?AOT)

    AOT(Ahead-Of-Time)編譯是與?JIT(Just-In-Time)相對(duì)的一種編譯方式,這篇文章主要介紹了如何啟用?Java?AOT?編譯打包?Solon?項(xiàng)目(Solon?AOT),需要的朋友可以參考下
    2025-05-05
  • Java工廠模式的深入了解

    Java工廠模式的深入了解

    這篇文章主要為大家介紹了Java工廠模式,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-01-01
  • 利用過(guò)濾器修改response中的返回值

    利用過(guò)濾器修改response中的返回值

    文章介紹了如何通過(guò)繼承HttpServletResponseWrapper并重寫(xiě)Response對(duì)象的方法來(lái)獲取response中的返回值,同時(shí)還分享了如何配置過(guò)濾器
    2024-12-12
  • Java的Lambda表達(dá)式使用及說(shuō)明

    Java的Lambda表達(dá)式使用及說(shuō)明

    文章介紹了JavaSE8中的Lambda表達(dá)式,其基本語(yǔ)法、函數(shù)接口的概念以及在集合中的使用,同時(shí),還討論了Lambda表達(dá)式的變量捕獲和一些優(yōu)點(diǎn)與缺點(diǎn)
    2026-02-02
  • SpringBoot集成RedisTemplate的實(shí)現(xiàn)示例

    SpringBoot集成RedisTemplate的實(shí)現(xiàn)示例

    本文主要介紹了SpringBoot集成RedisTemplate的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2025-09-09

最新評(píng)論

东海县| 综艺| 皮山县| 平遥县| 芒康县| 苏尼特左旗| 星子县| 白水县| 图们市| 罗源县| 防城港市| 邯郸市| 五寨县| 南城县| 同德县| 双桥区| 瑞金市| 宜黄县| 洪泽县| 昭觉县| 黄石市| 锡林郭勒盟| 青神县| 雷波县| 辽宁省| 金川县| 张家港市| 江阴市| 田阳县| 余江县| 安宁市| 合肥市| 仙桃市| 泗洪县| 龙山县| 嵩明县| 昌黎县| 龙海市| 陆河县| 衡水市| 承德市|