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

DES 與 3DES 加密算法原理及 Java 實戰詳解

     編輯:Java 相關知識

DES 算法原理

DES (Data Encryption Standard):1977 年成為美國聯邦標準(FIPS)。屬於對稱分組加密,分組長度 64 位,有效密鑰 56 位(含 8 位校驗位)。核心流程:

  1. 初始置換 (IP):64 位明文按固定表重排,分為 L₀、R₀ 各 32 位。
  2. 16 輪 Feistel 迭代:每輪使用 48 位子鑰,經擴展置換、S 盒代換、P 盒置換、異或運算生成新的 Lᵢ、Rᵢ。
  3. 逆置換 (IP⁻¹):將 L₁₆、R₁₆ 合併按逆表還原,輸出 64 位密文。

解密流程與加密相同,僅子鑰使用順序相反。

Java 基礎實現 (JCE)

public class DES {
    static final String KEY_ALGORITHM = "DES";
    static final String CIPHER_ECB = "DES/ECB/PKCS5Padding";
    static final String CIPHER_CBC = "DES/CBC/PKCS5Padding";

    public static void main(String[] args) throws Exception {
        // ECB 模式:密鑰生成器生成密鑰
        byte[] key = generateKey();
        byte[] enc = encrypt("胃炎F#*(x)".getBytes(), key);
        System.out.println("ECB 解密: " + new String(decrypt(enc, key)));

        // CBC 模式:密鑰工廠 + IV
        DESKeySpec dks = new DESKeySpec(generateKey());
        SecretKeyFactory skf = SecretKeyFactory.getInstance(KEY_ALGORITHM);
        SecretKey sk = skf.generateSecret(dks);
        Cipher cipher = Cipher.getInstance(CIPHER_CBC);
        cipher.init(Cipher.ENCRYPT_MODE, sk, new IvParameterSpec(getIV()));
        byte[] enc2 = cipher.doFinal("胃炎A%F#*(x)".getBytes());
        cipher.init(Cipher.DECRYPT_MODE, sk, new IvParameterSpec(getIV()));
        System.out.println("CBC 解密: " + new String(cipher.doFinal(enc2)));
    }

    static byte[] generateKey() throws Exception {
        KeyGenerator kg = KeyGenerator.getInstance(KEY_ALGORITHM);
        kg.init(56); // DES 固定 56 位有效密鑰
        return kg.generateKey().getEncoded();
    }

    static byte[] getIV() { return "asdfivh7".getBytes(); } // 8 字節

    static byte[] encrypt(byte[] data, byte[] key) throws Exception {
        Key k = toKey(key);
        Cipher c = Cipher.getInstance(CIPHER_ECB);
        c.init(Cipher.ENCRYPT_MODE, k, new SecureRandom());
        return c.doFinal(data);
    }
    // decrypt, toKey 類似...
}

3DES (Triple DES) 增強版

針對 DES 56 位密鑰易遭暴力破解,3DES 應用三個 56 位密鑰(K1、K2、K3)進行加密-解密-加密 (EDE) 操作,有效密鑰長度達 168 位(雙長鑰模式 112 位)。

Java 實現

public class TripleDES {
    static final String KEY_ALGORITHM = "DESede";
    static final String CIPHER_ECB = "DESede/ECB/PKCS5Padding";
    static final String CIPHER_CBC = "DESede/CBC/PKCS5Padding";

    public static void main(String[] args) throws Exception {
        // ECB
        TripleDES des = new TripleDES("ECB");
        des.encrypt("sau8jzxlcvm,'123`98(*^&%^^JCB ZX>>A<S<}}{");
        System.out.println("ECB 解密: " + new String(des.decrypt(encryptData)));

        // CBC
        des = new TripleDES("CBC");
        des.encrypt2("sau8jzxlc DQV#><«|vm,'123`98(*^&%^^JCB ZX>>A<S<}}{");
        System.out.println("CBC 解密: " + new String(des.decrypt2(encryptData)));
    }

    public TripleDES(String mode) throws Exception {
        if ("ECB".equals(mode)) {
            cipher = Cipher.getInstance(CIPHER_ECB);
            keyGen = KeyGenerator.getInstance(KEY_ALGORITHM);
            secretKey = keyGen.generateKey(); // 自動生成 168 位密鑰
        } else {
            cipher = Cipher.getInstance(CIPHER_CBC);
            keyGen = KeyGenerator.getInstance(KEY_ALGORITHM);
            DESedeKeySpec spec = new DESedeKeySpec(keyGen.generateKey().getEncoded());
            secretKey2 = SecretKeyFactory.getInstance(KEY_ALGORITHM).generateSecret(spec);
        }
    }
    // encrypt/decrypt/encrypt2/decrypt2 方法...
}

模式選擇與安全建議

模式特點適用場景
ECB無 IV,相同明文塊產生相同密文塊,模式可見性差極少數只加密單塊數據(如密鑰加密)
CBC需 IV,引入鏈式依賴,語義安全性強通用數據加密首選
CTR/GCM可並行、支持認證加密 (AEAD)高性能、需完整性保護場景(推薦 GCM)

現代替代方案

  • AES (Advanced Encryption Standard):128/192/256 位密鑰,性能更優、安全性更高,首選對稱加密算法。
  • ChaCha20-Poly1305:軟件實現極快,無硬件加速依賴,移動端/物聯網優選。
  • DES/3DES 已被 NIST 棄用(SP 800-131A Rev. 2),新系統嚴禁使用,存量系統應規劃遷移至 AES-GCM。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved