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 方法
}
重要注意事項
- 金鑰長度:DES 要求 8 位元組(56 位元有效),不足需補齊,超出會截斷
- 字元編碼:
password.getBytes() 預設用平台編碼,建議明確指定 getBytes("UTF-8")
- 模式與填充:
Cipher.getInstance("DES") 預設為 ECB 模式 + PKCS5Padding,**ECB 不安全**,生產環境應指定 "DES/CBC/PKCS5Padding" 並提供 IV
- 金鑰管理:勿硬編碼金鑰,應使用金鑰管理系統或環境變數
- 異常處理:解密失敗拋出
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);
現代替代方案建議