3DES(Triple DES,正式名稱為 TDEA / Triple Data Encryption Algorithm) 是密碼學史上為了延續 DES 壽命而開發的過渡期區塊加密標準。
在 1990 年代末期,隨著電腦算力提升,單層 DES 的 56 位元金鑰已被證實極易遭暴力破解。在 AES(進階加密標準)尚未選出的過渡時期,密碼學界透過重複套用三次 DES 運算來快速提升安全強度,成功讓 DES 家族的壽命延長了十數年。


| 模式 | 金鑰配置 | 名義金鑰長度 | 實務安全強度 | 說明 |
|---|---|---|---|---|
| Option 1 (3-Key) | K1!= K2!= K3 | 168 bits | 約 112 bits | 三把獨立金鑰,但受 meet-in-the-middle 類攻擊影響,安全性非 168 bits。 |
| Option 2 (2-Key) | K1=K3!= K2 | 112 bits | 約 80 bits | 曾被金融設備大量使用;現代標準已不建議。 |
| Option 3 (1-Key) | K1=K2=K3 | 56 bits | 56 bits | 完全退化為 DES,讓舊系統在硬體與協定過渡期比較容易銜接。 |
備註1:3DES 的「名義金鑰長度」和「有效安全強度」不是同一件事。
即使金鑰變長,3DES 的區塊大小依然是 DES 的 64 bits。在 CBC 等模式中,當同一把金鑰累積處理大量資料時,會提高區塊碰撞機率,進而產生可利用的攻擊面(著名案例是 Sweet32)。
3DES 本質是 3 次 DES。DES 又是偏硬體電路時代的設計,在現代通用 CPU 上不如 AES(特別是有 AES-NI 指令集時)高效。實務上 3DES 的吞吐量與延遲都很吃虧。
在 Java JCA 中,3DES 的官方標準演算法名稱為 DESede,亦即DES Encrypt-Decrypt-Encrypt的簡稱,Java範例如下
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.IvParameterSpec;
import java.security.SecureRandom;
public class Legacy3DESExample {
public static void main(String[] args) throws Exception {
// 3DES 已全面廢止,新系統嚴禁使用!
KeyGenerator keyGen = KeyGenerator.getInstance("DESede");
keyGen.init(168); // 3-Key 模式 (有效長度 168 bits)
SecretKey key = keyGen.generateKey();
byte[] iv = new byte[8]; // 64-bit 區塊大小,IV 為 8 位元組
new SecureRandom().nextBytes(iv);
// 轉換名稱:DESede/CBC/PKCS5Padding
Cipher cipher = Cipher.getInstance("DESede/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, key, new IvParameterSpec(iv));
byte[] plaintext = "Sensitive Financial Data".getBytes();
byte[] ciphertext = cipher.doFinal(plaintext);
}
}