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 加密時,一定要謹(jǐn)慎選擇分組模式和填充方式,確保安全性和兼容性。希望通過本文,你對 Java 中的 AES 加密有了更深入的了解。
到此這篇關(guān)于Java中的AES加密算法用法的文章就介紹到這了,更多相關(guān)Java中AES加密詳解內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解Java的JDBC中Statement與PreparedStatement對象
這篇文章主要介紹了詳解Java的JDBC中Statement與PreparedStatement對象,PreparedStatement一般來說比使用Statement效率更高,需要的朋友可以參考下2015-12-12
SpringBoot動態(tài)Feign服務(wù)調(diào)用詳解
Feign是Netflix公司開發(fā)的一個聲明式的REST調(diào)用客戶端; Ribbon負(fù)載均衡、 Hystrⅸ服務(wù)熔斷是我們Spring Cloud中進行微服務(wù)開發(fā)非常基礎(chǔ)的組件,在使用的過程中我們也發(fā)現(xiàn)它們一般都是同時出現(xiàn)的,而且配置也都非常相似2022-12-12
Python中scrapy框架的ltem和scrapy.Request詳解
這篇文章主要介紹了Python中scrapy框架的ltem和scrapy.Request詳解,Item是保存爬取數(shù)據(jù)的容器,它的使用方法和字典類似,不過,相比字典,Item提供了額外的保護機制,可以避免拼寫錯誤或者定義字段錯誤,需要的朋友可以參考下2023-09-09
聊聊java中一些減少if else 的編碼習(xí)慣的方法
這篇文章主要介紹了聊聊java中一些減少if else 的編碼習(xí)慣的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08
SpringBoot使用工具類實現(xiàn)獲取容器中的Bean
這篇文章主要為大家詳細(xì)介紹了SpringBoot如何使用工具類實現(xiàn)獲取容器中的Bean,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-03-03
logback的ShutdownHook關(guān)閉原理解析
這篇文章主要為大家介紹了logback的ShutdownHook關(guān)閉原理源碼解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-11-11
詳解SimpleDateFormat的線程安全問題與解決方案
這篇文章主要介紹了SimpleDateFormat的線程安全問題與解決方案,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2017-03-03

