首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java AES 加密解密入門實作(ECB/NoPadding 基礎版)

     編輯:Java 相關知識

AES (Advanced Encryption Standard) 是目前對稱加密的工業標準。Java 提供完善的 JCA/JCE API,調用簡單但需注意模式、填充、金鑰長度等細節。本文提供最基礎的 AES-128 ECB/NoPadding 實作,作為進階模式(CBC、GCM 等)的入門基石。

核心類別:AESCipher

import javax.crypto.*;
import javax.crypto.spec.*;
import java.security.*;

public class AESCipher {
    private final byte[] aesKey = new byte[16]; // AES-128 = 16 bytes
    private Cipher cipher;
    private SecretKeySpec secretKey;

    public AESCipher() {
        // 示範用固定金鑰,實務請用 PBKDF2/SCrypt/Argon2 衍生
        for (int i = 0; i < 16; i++) aesKey[i] = 0x01;
    }

    public void init() throws Exception {
        secretKey = new SecretKeySpec(aesKey, "AES");
        // ECB 模式不需 IV,NoPadding 要求資料為 16 bytes 倍數
        cipher = Cipher.getInstance("AES/ECB/NoPadding");
    }

    public byte[] encrypt(byte[] plaintext) throws Exception {
        cipher.init(Cipher.ENCRYPT_MODE, secretKey);
        return cipher.doFinal(plaintext);
    }

    public byte[] decrypt(byte[] ciphertext) throws Exception {
        cipher.init(Cipher.DECRYPT_MODE, secretKey);
        return cipher.doFinal(ciphertext);
    }
}

呼叫範例

public static void main(String[] args) {
    try {
        AESCipher cipher = new AESCipher();
        cipher.init();

        // 測試資料:16 bytes (1 個區塊)
        byte[] input = new byte[16];
        for (int i = 0; i < 16; i++) input[i] = 0x01;

        System.out.println("原文: " + bytesToHex(input));

        byte[] encrypted = cipher.encrypt(input);
        System.out.println("密文: " + bytesToHex(encrypted));

        byte[] decrypted = cipher.decrypt(encrypted);
        System.out.println("解密: " + bytesToHex(decrypted));

    } catch (Exception e) {
        e.printStackTrace();
    }
}

private static String bytesToHex(byte[] data) {
    StringBuilder sb = new StringBuilder();
    for (byte b : data) sb.append(String.format("%02X", b));
    return sb.toString();
}

模式與填充對照表(必懂觀念)

模式需 IV平行運算適用場景備註
ECB否是極少(僅教學/測試)相同明文產生相同密文,嚴重洩漏模式
CBC是否(加密)/是(解密)通用加密需隨機 IV,配合 PKCS5Padding
CTR是是串流加密、隨機存取將區塊密碼轉為串流密碼
GCM是是推薦:生產環境首選AEAD 模式,同時提供機密性+完整性驗證

常見填充方式

  • NoPadding:資料長度必須為區塊大小倍數(AES=16 bytes),否則拋出 IllegalBlockSizeException
  • PKCS5Padding (PKCS7Padding):自動填充至倍數,解密時自動移除,最常用
  • ISO10126Padding:填充隨機資料,已較少用

實務生產級建議(必讀)

// 生產環境推薦:AES-256-GCM (AEAD)
Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding");
SecretKeySpec keySpec = new SecretKeySpec(deriveKey(password, salt), "AES");
byte[] iv = new byte[12]; // GCM 建議 96-bit IV
SecureRandom random = new SecureRandom();
random.nextBytes(iv);
GCMParameterSpec gcmSpec = new GCMParameterSpec(128, iv); // 128-bit 標籤

cipher.init(Cipher.ENCRYPT_MODE, keySpec, gcmSpec);
byte[] ciphertext = cipher.doFinal(plaintext);
// 輸出格式:IV (12 bytes) + ciphertext + authTag (16 bytes)

效能提示

  • Java 加密效能受限於 JCE 提供者實現,大量資料加密建議使用 CipherInputStream/CipherOutputStream 串流處理
  • 極高吞吐量場景可考慮 JNI 呼叫 OpenSSL/BoringSSL 或使用 javax.crypto.Cipher 的多執行緒並行
  • 金鑰衍生(PBKDF2/Argon2)較耗時,登入驗證時可快取衍生金鑰

延伸閱讀

  • Java DES 加密解密實作(本系列上一篇)
  • NIST SP 800-38D:GCM 模式標準
  • RFC 5116:AEAD 演算法介面定義
  • OWASP Key Management Cheat Sheet

從 ECB/NoPadding 起步,理解區塊、模式、填充、IV、金鑰長度的關係,再進階至 GCM,才能在實務中正確選型並避開常見坑點。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved