怎樣用Java實現加密解密?AES算法完整實現

如何在Java中實現aes加密解密功能?1. 準備工作:引入javax.crypto包和secretkeyspec類,使用jdk自帶類庫即可,建議java 8及以上環境;2. 生成密鑰:通過securerandom生成128位隨機密鑰,或使用固定字符串測試;3. 加密過程:采用aes/cbc/pkcs5padding模式,生成隨機iv并拼接base64編碼的iv與密文;4. 解密過程:拆分iv和密文部分,使用相同密鑰和iv進行解密;5. 完整示例:調用encrypt和decrypt方法完成加密解密流程;6. 注意事項:避免硬編碼密鑰,使用密鑰管理系統,每次生成新iv,推薦cbc模式,避免ecb,考慮結合hmac或gcm增強安全性。

怎樣用Java實現加密解密?AES算法完整實現

實現加密解密功能在Java中是一個常見的需求,尤其在處理敏感數據時。AES(Advanced Encryption Standard)是一種廣泛使用的對稱加密算法,具有較高的安全性和效率。下面將介紹如何使用Java實現完整的AES加密和解密過程。

怎樣用Java實現加密解密?AES算法完整實現


1. 準備工作:引入必要的類庫

在Java中,AES加密主要依賴于javax.crypto包,以及SecretKeySpec類來生成密鑰。標準的JDK通常已經包含這些類,不需要額外引入第三方庫。不過,如果你需要更靈活的功能(比如PKCS7填充),可以考慮使用Bouncy Castle等擴展庫。

怎樣用Java實現加密解密?AES算法完整實現

確保你的Java環境版本至少是 Java 8 或更高,并且沒有限制策略文件(默認情況下是允許的)。

立即學習Java免費學習筆記(深入)”;


2. 生成密鑰:使用固定或隨機密鑰

AES要求一個密鑰(Key),通常是128位、192位或256位長度。這里我們以128位為例:

怎樣用Java實現加密解密?AES算法完整實現

import javax.crypto.spec.SecretKeySpec; import java.security.SecureRandom;  public class AESExample {     private static final String ALGORITHM = "AES";      public static byte[] generateKey() {         byte[] key = new byte[16]; // 128 bits         new SecureRandom().nextBytes(key);         return key;     }      public static SecretKeySpec createKey(byte[] key) {         return new SecretKeySpec(key, ALGORITHM);     } }

注意:為了方便測試,你也可以使用固定的字符串作為密鑰,例如 “1234567890abcdef”,但生產環境中建議使用隨機生成的密鑰。


3. 加密過程:使用AES/CBC/PKCS5Padding模式

AES支持多種工作模式,推薦使用CBC(Cipher Block Chaining)加上IV(初始化向量)以增強安全性。

import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; import java.util.Base64;  public class AESExample {      // ... 前面的generateKey和createKey方法省略 ...      public static String encrypt(byte[] key, String data) throws Exception {         Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");         byte[] iv = new byte[16]; // 初始化向量         new SecureRandom().nextBytes(iv);         IvParameterSpec ivSpec = new IvParameterSpec(iv);          cipher.init(Cipher.ENCRYPT_MODE, createKey(key), ivSpec);         byte[] encrypted = cipher.doFinal(data.getBytes());          // 返回 Base64 編碼結果 + IV(便于后續解密)         return Base64.getEncoder().encodeToString(iv) + ":" + Base64.getEncoder().encodeToString(encrypted);     } }
  • 使用 AES/CBC/PKCS5Padding 模式。
  • 初始化向量(IV)每次不同,因此需要保存下來用于解密。
  • 返回值格式為 iv:encrypted_data,用冒號分隔。

4. 解密過程:解析IV并還原原始數據

解密時,需要先提取出IV部分,然后使用相同的密鑰進行解密。

public static String decrypt(byte[] key, String encryptedData) throws Exception {     String[] parts = encryptedData.split(":");     byte[] iv = Base64.getDecoder().decode(parts[0]);     byte[] cipherText = Base64.getDecoder().decode(parts[1]);      Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");     IvParameterSpec ivSpec = new IvParameterSpec(iv);     cipher.init(Cipher.DECRYPT_MODE, createKey(key), ivSpec);     byte[] decrypted = cipher.doFinal(cipherText);      return new String(decrypted); }
  • 注意異常處理,尤其是Base64解碼和分割字符串可能拋出錯誤。
  • 如果密鑰或IV不匹配,解密會失敗。

5. 完整示例:調用方式參考

你可以這樣使用上面的方法:

public static void main(String[] args) throws Exception {     byte[] key = generateKey();     String original = "Hello, this is a secret message!";      String encrypted = encrypt(key, original);     System.out.println("Encrypted: " + encrypted);      String decrypted = decrypt(key, encrypted);     System.out.println("Decrypted: " + decrypted); }

輸出大致如下:

Encrypted: 3q2+7wIDAQIDBAUGBwgJCgsMDQ4PECESFBUWFxgZGhscHB4fIBE= Decrypted: Hello, this is a secret message!

6. 實際應用中的注意事項

  • 密鑰管理很重要
    • 不要硬編碼在代碼中。
    • 可以使用密鑰管理系統(如Vault)或加密存儲。
  • IV每次都要隨機生成,不能復用。
  • 加密后的內容通常使用Base64傳輸或存儲,避免亂碼。
  • 加密模式選擇
    • CBC 是較常用的安全模式。
    • ECB 模式雖然簡單但不推薦,因為容易被分析。
  • 如果需要認證機制(防止篡改),可以結合HMAC或者使用AEAD模式(如AES/GCM/NoPadding)。

基本上就這些了。AES加密在Java中實現并不復雜,但細節上容易忽略,特別是密鑰管理和模式選擇。只要注意這些點,就能寫出安全可靠的加密代碼。

? 版權聲明
THE END
喜歡就支持一下吧
點贊8 分享