Java中的AES加密算法用法示例詳解
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)用法詳解
優(yōu)先級隊列是一種先進先出的數(shù)據(jù)結(jié)構(gòu),操作的數(shù)據(jù)帶有優(yōu)先級,這種數(shù)據(jù)結(jié)構(gòu)就是優(yōu)先級隊列(PriorityQueue)。本文將詳細講講Java優(yōu)先級隊列的用法,感興趣的可以了解一下2022-07-07spring-boot-starter-thymeleaf加載外部html文件方式
本文介紹了在SpringMVC中使用Thymeleaf模板引擎加載外部HTML文件的方法,以及在Spring Boot中使用Thymeleaf的基本步驟,包括引入依賴、創(chuàng)建Controller、創(chuàng)建HTML文件、參數(shù)化訪問、熱加載和熱更新文件2025-02-02Java定時任務(wù)schedule和scheduleAtFixedRate的異同
本文主要介紹了Java定時任務(wù)schedule和scheduleAtFixedRate的異同,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-05-05Spring Security 實現(xiàn)“記住我”功能及原理解析
這篇文章主要介紹了Spring Security 實現(xiàn)“記住我”功能及原理解析,需要的朋友可以參考下2020-05-05詳解spring cloud hystrix 請求合并collapsing
這篇文章主要介紹了詳解spring cloud hystrix 請求合并collapsing,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-05-05