算法背景
- DES:56 位密鑰 + 8 位校驗,64 位分組,16 輪 Feistel 結構
- 1999 年 NIST 限制僅用於遺留系統,現推薦 AES
- 3DES (DESede):三次 DES,有效密鑰長度 112 位,兼容性較好
JDK 支持參數
| 項目 | 值 |
| 密鑰長度 | 56 位 (DES) / 112/168 位 (3DES) |
| 模式 | ECB/CBC/PCBC/CTR/CTS/CFB/OFB 等 |
| 填充 | NoPadding/PKCS5Padding/ISO10126Padding |
加密工具類
public class DesCoder {
private static final String ALGO = "DES";
private static final SecureRandom RANDOM = new SecureRandom();
public static byte[] encrypt(byte[] data, byte[] key) throws Exception {
DESKeySpec dks = new DESKeySpec(key);
SecretKeyFactory kf = SecretKeyFactory.getInstance(ALGO);
SecretKey sk = kf.generateSecret(dks);
Cipher cipher = Cipher.getInstance(ALGO);
cipher.init(Cipher.ENCRYPT_MODE, sk, RANDOM);
return cipher.doFinal(data);
}
public static byte[] decrypt(byte[] data, byte[] key) throws Exception {
DESKeySpec dks = new DESKeySpec(key);
SecretKeyFactory kf = SecretKeyFactory.getInstance(ALGO);
SecretKey sk = kf.generateSecret(dks);
Cipher cipher = Cipher.getInstance(ALGO);
cipher.init(Cipher.DECRYPT_MODE, sk, RANDOM);
return cipher.doFinal(data);
}
// 十六進制字符串轉換輔助
public static String toHex(byte[] b) { ... }
public static byte[] fromHex(String s) { ... }
}
3DES 升級建議
// 僅需將算法名改為 "DESede",密鑰長度 24 字節 (168 位)
Cipher.getInstance("DESede/CBC/PKCS5Padding");
安全提醒
- ECB 模式不安全(相同明文產生相同密文),生產環境必須用 CBC + 隨機 IV
- 密鑰管理:勿硬編碼,使用密鑰管理系統或環境變量
- 新項目優先選擇 AES-256-GCM