首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> SQL Server 2008

Java 實作 DES 對稱加密演算法完整教學與程式碼範例

     編輯:SQL Server 2008

DES 演算法簡介

  • 類型:對稱加密(加解密使用相同金鑰)
  • 起源:IBM 研究,美國政府曾採用為標準
  • 金鑰長度:56 位元(含 8 位元校驗位,實際 64 位元)
  • 現狀:現代運算能力可在 24 小時內暴力破解,不建議用於高安全性場景
  • 適用場景:簡單應用、教學示範、相容舊系統

Java 實作核心類別

  • DESKeySpec:DES 金鑰規格
  • SecretKeyFactory:金鑰工廠,轉換規格為 SecretKey
  • Cipher:加解密核心引擎
  • SecureRandom:安全隨機數產生器

加密方法實作

public byte[] desEncrypt(byte[] data, String password) {
    try {
        // 1. 安全隨機數源
        SecureRandom random = new SecureRandom();
        
        // 2. 建立 DES 金鑰規格(密碼必須 8 位元組倍數)
        DESKeySpec desKeySpec = new DESKeySpec(password.getBytes());
        
        // 3. 金鑰工廠產生密鑰
        SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
        SecretKey secretKey = keyFactory.generateSecret(desKeySpec);
        
        // 4. 初始化 Cipher 進行加密
        Cipher cipher = Cipher.getInstance("DES");
        cipher.init(Cipher.ENCRYPT_MODE, secretKey, random);
        
        // 5. 執行加密
        return cipher.doFinal(data);
    } catch (Exception e) {
        e.printStackTrace();
        return null;
    }
}

解密方法實作

public byte[] desDecrypt(byte[] encryptedData, String password) throws Exception {
    // 1. 安全隨機數源
    SecureRandom random = new SecureRandom();
    
    // 2. 建立金鑰規格
    DESKeySpec desKeySpec = new DESKeySpec(password.getBytes());
    
    // 3. 金鑰工廠
    SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
    SecretKey secretKey = keyFactory.generateSecret(desKeySpec);
    
    // 4. 初始化 Cipher 進行解密
    Cipher cipher = Cipher.getInstance("DES");
    cipher.init(Cipher.DECRYPT_MODE, secretKey, random);
    
    // 5. 執行解密
    return cipher.doFinal(encryptedData);
}

完整測試範例

public class DESCryptoDemo {
    public static void main(String[] args) {
        // 待加密內容
        String plainText = "測試加密內容";
        
        // 密鑰:長度必須是 8 的倍數(這裡用 8 字元 = 8 位元組)
        String password = "12345678";
        
        try {
            // 加密
            byte[] encrypted = desEncrypt(plainText.getBytes("UTF-8"), password);
            System.out.println("加密後 (Base64): " + Base64.getEncoder().encodeToString(encrypted));
            
            // 解密
            byte[] decrypted = desDecrypt(encrypted, password);
            System.out.println("解密後: " + new String(decrypted, "UTF-8"));
            
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    // 此處放入上述 desEncrypt / desDecrypt 方法
}

重要注意事項

  1. 金鑰長度:DES 要求 8 位元組(56 位元有效),不足需補齊,超出會截斷
  2. 字元編碼:password.getBytes() 預設用平台編碼,建議明確指定 getBytes("UTF-8")
  3. 模式與填充:Cipher.getInstance("DES") 預設為 ECB 模式 + PKCS5Padding,**ECB 不安全**,生產環境應指定 "DES/CBC/PKCS5Padding" 並提供 IV
  4. 金鑰管理:勿硬編碼金鑰,應使用金鑰管理系統或環境變數
  5. 異常處理:解密失敗拋出 BadPaddingException,需妥善捕獲

進階:CBC 模式範例(生產環境建議)

// 加密 - CBC 模式
Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
byte[] iv = new byte[8]; // 實際應用應用安全隨機產生
SecureRandom random = new SecureRandom();
random.nextBytes(iv);
IvParameterSpec ivSpec = new IvParameterSpec(iv);
cipher.init(Cipher.ENCRYPT_MODE, secretKey, ivSpec);
byte[] encrypted = cipher.doFinal(data);
// 儲存時需將 IV 與密文一起保存(IV 不需保密)

// 解密 - CBC 模式
cipher.init(Cipher.DECRYPT_MODE, secretKey, ivSpec);
byte[] decrypted = cipher.doFinal(encrypted);

現代替代方案建議

總結

本文提供 DES 加解密完整 Java 實作,涵蓋 ECB/CBC 模式、金鑰處理、編碼注意事項。強調 DES 已不安全,新專案請直接採用 AES-GCM 或 ChaCha20-Poly1305 等經認證的現代加密演算法。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
演算法金鑰長度安全性建議用途
AES128/192/256 位元高所有新專案首選
ChaCha20-Poly1305256 位元高行動裝置、無硬體加速環境
DES56 位元低(已淘汰)僅相容舊系統
3DES168 位元中(已棄用)遷移期間過渡使用