在信息安全領域,加密算法是保護數據機密性的核心手段。本文深入淺出地介紹 DES 對稱加密算法的原理特點,並提供完整的 Java 代碼實現,幫助開發者快速掌握數據加密解密技術。
| 維度 | 對稱加密 (DES/AES) | 非對稱加密 (RSA/ECC) |
|---|---|---|
| 密鑰特點 | 加密解密使用同一密鑰 | 公鑰加密,私鑰解密 |
| 計算速度 | 快,適合大數據量 | 慢,計算複雜度高 |
| 安全性 | 密鑰分發需安全通道 | 高,解決密鑰分發難題 |
| 典型應用 | 數據傳輸加密、文件加密 | 密鑰交換、數字簽名、CA證書 |
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);
}
/**
* 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);
}
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 字節數組版本方法...
}
DES 要求密鑰 必須為 8 字節 (64 位)。實際開發中常見處理方式:
Arrays.copyOf(keyBytes, 8) 統一處理代碼中 Cipher.getInstance("DES") 使用的是 JDK 默認模式 ECB/PKCS5Padding:
生產建議:顯式指定 "DES/CBC/PKCS5Padding" 並隨機生成 IV。
在 DES/ECB 模式下,SecureRandom 實際上不影響加密結果,但在某些提供者實現中可能用於生成內部參數。CBC 模式下則用於生成 IV。
本文詳細講解了 DES 算法原理、Java 實現代碼及關鍵技術細節。雖然 DES 具有歷史意義且代碼實現簡單,但在現代應用開發中,請務必選擇 AES 等更安全的算法。理解 DES 的實現過程有助於掌握對稱加密的核心概念,為學習更高級密碼學打下基礎。