DES (Data Encryption Standard):1977 年成為美國聯邦標準(FIPS)。屬於對稱分組加密,分組長度 64 位,有效密鑰 56 位(含 8 位校驗位)。核心流程:
解密流程與加密相同,僅子鑰使用順序相反。
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 類似...
}
針對 DES 56 位密鑰易遭暴力破解,3DES 應用三個 56 位密鑰(K1、K2、K3)進行加密-解密-加密 (EDE) 操作,有效密鑰長度達 168 位(雙長鑰模式 112 位)。
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) |