iT邦幫忙

2026 iThome 鐵人賽

DAY 18
0
Software Development

我是Java工程師,關於密碼學我想懂的不多系列 第 18 篇

Day17 - 對稱金鑰加密系統:3DES 加密演算法

  • 分享至 

  • xImage
  •  

前言

3DES(Triple DES,正式名稱為 TDEA / Triple Data Encryption Algorithm) 是密碼學史上為了延續 DES 壽命而開發的過渡期區塊加密標準。

在 1990 年代末期,隨著電腦算力提升,單層 DES 的 56 位元金鑰已被證實極易遭暴力破解。在 AES(進階加密標準)尚未選出的過渡時期,密碼學界透過重複套用三次 DES 運算來快速提升安全強度,成功讓 DES 家族的壽命延長了十數年。

一、 3DES 核心運算:EDE(Encrypt-Decrypt-Encrypt)架構

1. 加密流程

https://ithelp.ithome.com.tw/upload/images/20261002/20128084MLfKsbaNCn.png

2. 解密流程

https://ithelp.ithome.com.tw/upload/images/20261002/20128084B4jzC6eluH.png

二、金鑰選項與實際安全強度

模式 金鑰配置 名義金鑰長度 實務安全強度 說明
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 缺陷

1. 區塊大小仍只有 64 bits(Sweet32 風險)

即使金鑰變長,3DES 的區塊大小依然是 DES 的 64 bits。在 CBC 等模式中,當同一把金鑰累積處理大量資料時,會提高區塊碰撞機率,進而產生可利用的攻擊面(著名案例是 Sweet32)。

2. 效能顯著落後 AES

3DES 本質是 3 次 DES。DES 又是偏硬體電路時代的設計,在現代通用 CPU 上不如 AES(特別是有 AES-NI 指令集時)高效。實務上 3DES 的吞吐量與延遲都很吃虧。

3. 安全標準正式全面廢止

  • 2017 年:NIST(美國國家標準暨技術研究院)限制 3DES 加密單一金鑰下的資料量。
  • 2023 年底:NIST 官方規範正式宣告 完全禁止(Disallow) 所有新舊系統繼續使用 3DES 進行任何加密保護。

四、 Java JCA 實作範例

在 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);
    }
}


上一篇
Day16 - 對稱金鑰加密系統:DES 加密演算法
下一篇
Day18 - 對稱金鑰加密系統:AES加密演算法
系列文
我是Java工程師,關於密碼學我想懂的不多 共 22 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言