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

DES 對稱加密算法原理與 Java 實現詳解

     編輯:Java 綜合教學

前言

在信息安全領域,加密算法是保護數據機密性的核心手段。本文深入淺出地介紹 DES 對稱加密算法的原理特點,並提供完整的 Java 代碼實現,幫助開發者快速掌握數據加密解密技術。

一、加密算法分類與 DES 定位

1.1 對稱 vs 非對稱加密

維度 對稱加密 (DES/AES) 非對稱加密 (RSA/ECC)
密鑰特點 加密解密使用同一密鑰 公鑰加密,私鑰解密
計算速度 快,適合大數據量 慢,計算複雜度高
安全性 密鑰分發需安全通道 高,解決密鑰分發難題
典型應用 數據傳輸加密、文件加密 密鑰交換、數字簽名、CA證書

1.2 DES 算法簡介

  • 全稱:Data Encryption Standard (數據加密標準)
  • 特點:64 位分組加密,56 位有效密鑰 (含 8 位校驗位)
  • 輸出:密文為 0-9、A-F 十六進制字符組成
  • 現狀:因密鑰長度較短,已被 AES 取代,但仍用於兼容舊系統

二、Java 核心代碼實現

2.1 加密核心方法

private static final String ALGORITHM = "DES";

/**
 * DES 加密
 * @param data 待加密數據 (字節數組)
 * @param key  密鑰 (字節數組,長度需 8 字節)
 * @return 加密後的字節數組
 */
private static byte[] encrypt(byte[] data, byte[] key) throws Exception {
    // 1. 安全隨機數生成器
    SecureRandom sr = new SecureRandom();
    
    // 2. 密鑰規範轉換
    DESKeySpec dks = new DESKeySpec(key);
    
    // 3. 密鑰工廠生成密鑰
    SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(ALGORITHM);
    SecretKey secureKey = keyFactory.generateSecret(dks);
    
    // 4. 密碼器初始化 (加密模式)
    Cipher cipher = Cipher.getInstance(ALGORITHM);
    cipher.init(Cipher.ENCRYPT_MODE, secureKey, sr);
    
    // 5. 執行加密
    return cipher.doFinal(data);
}

2.2 解密核心方法

/**
 * DES 解密
 * @param data 待解密數據 (字節數組)
 * @param key  密鑰 (需與加密時一致)
 * @return 解密後的字節數組
 */
private static byte[] decrypt(byte[] data, byte[] key) throws Exception {
    SecureRandom sr = new SecureRandom();
    DESKeySpec dks = new DESKeySpec(key);
    SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(ALGORITHM);
    SecretKey secureKey = keyFactory.generateSecret(dks);
    
    Cipher cipher = Cipher.getInstance(ALGORITHM);
    // 關鍵區別:初始化為解密模式
    cipher.init(Cipher.DECRYPT_MODE, secureKey, sr);
    
    return cipher.doFinal(data);
}

2.3 完整工具類封裝建議

public class DESUtil {
    private static final String ALGORITHM = "DES";
    private static final String CHARSET = "UTF-8";

    /** 字節數組轉十六進制字符串 */
    public static String bytesToHex(byte[] bytes) {
        StringBuilder sb = new StringBuilder();
        for (byte b : bytes) {
            sb.append(String.format("%02X", b));
        }
        return sb.toString();
    }

    /** 十六進制字符串轉字節數組 */
    public static byte[] hexToBytes(String hex) {
        byte[] bytes = new byte[hex.length() / 2];
        for (int i = 0; i < bytes.length; i++) {
            bytes[i] = (byte) Integer.parseInt(hex.substring(2*i, 2*i+2), 16);
        }
        return bytes;
    }

    /** 高層封裝:字符串加密返回 Hex 字符串 */
    public static String encrypt(String plainText, String key) throws Exception {
        byte[] data = plainText.getBytes(CHARSET);
        byte[] keyBytes = key.getBytes(CHARSET);
        // 確保密鑰為 8 字節 (可補齊或截取)
        byte[] validKey = Arrays.copyOf(keyBytes, 8);
        byte[] encrypted = encrypt(data, validKey);
        return bytesToHex(encrypted);
    }

    /** 高層封裝:Hex 字符串解密返回明文 */
    public static String decrypt(String hexData, String key) throws Exception {
        byte[] data = hexToBytes(hexData);
        byte[] keyBytes = key.getBytes(CHARSET);
        byte[] validKey = Arrays.copyOf(keyBytes, 8);
        byte[] decrypted = decrypt(data, validKey);
        return new String(decrypted, CHARSET);
    }
    
    // 此處省略 encrypt/decrypt 字節數組版本方法...
}

三、關鍵技術點深度解析

3.1 密鑰長度處理

DES 要求密鑰 必須為 8 字節 (64 位)。實際開發中常見處理方式:

  • 不足 8 字節:右側補 \0 或空格
  • 超過 8 字節:截取前 8 字節
  • 推薦:使用 Arrays.copyOf(keyBytes, 8) 統一處理

3.2 模式與填充

代碼中 Cipher.getInstance("DES") 使用的是 JDK 默認模式 ECB/PKCS5Padding:

  • ECB 模式:每個分組獨立加密,相同明文產生相同密文,不安全,不推薦生產環境使用
  • CBC 模式:引入初始化向量 (IV),相同明文產生不同密文,安全性更高

生產建議:顯式指定 "DES/CBC/PKCS5Padding" 並隨機生成 IV。

3.3 SecureRandom 的作用

在 DES/ECB 模式下,SecureRandom 實際上不影響加密結果,但在某些提供者實現中可能用於生成內部參數。CBC 模式下則用於生成 IV。

四、安全性警示與替代方案

⚠️ 重要安全提醒

  • DES 56 位密鑰已可在數小時內被暴力破解,嚴禁用於新系統敏感數據保護
  • 3DES (Triple DES) 雖增強安全性,但效率低且仍有甜蜜攻擊風險
  • 強烈推薦使用 AES (Advanced Encryption Standard):支持 128/192/256 位密鑰,速度快、安全性高、為現行標準

五、總結

本文詳細講解了 DES 算法原理、Java 實現代碼及關鍵技術細節。雖然 DES 具有歷史意義且代碼實現簡單,但在現代應用開發中,請務必選擇 AES 等更安全的算法。理解 DES 的實現過程有助於掌握對稱加密的核心概念,為學習更高級密碼學打下基礎。

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