Java DES加解密
什么是DES加解密?
DES(Data Encryption Standard)是一种对称加密算法,它使用相同的密钥进行加解密操作。DES算法广泛应用于数据保护、安全通信等领域,它的安全性主要依赖于密钥的保密性。
在Java中,我们可以使用标准库提供的javax.crypto
包来实现DES加解密功能。该包中的Cipher
类提供了加解密的方法,我们可以使用不同的模式和填充方式来进行定制。
DES加密示例
下面是一个使用DES算法进行加密的示例代码:
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.security.NoSuchAlgorithmException;
public class DESDemo {
public static void main(String[] args) throws Exception {
// 生成密钥
SecretKey secretKey = generateKey();
byte[] keyBytes = secretKey.getEncoded();
// 明文
String plainText = "Hello, DES!";
// 加密
byte[] encryptedBytes = encrypt(plainText.getBytes(StandardCharsets.UTF_8), keyBytes);
// 打印加密后的结果
System.out.println("Encrypted: " + bytesToHex(encryptedBytes));
}
// 生成密钥
private static SecretKey generateKey() throws NoSuchAlgorithmException {
KeyGenerator keyGenerator = KeyGenerator.getInstance("DES");
return keyGenerator.generateKey();
}
// 加密
private static byte[] encrypt(byte[] plainBytes, byte[] keyBytes) throws Exception {
SecretKey secretKey = new SecretKeySpec(keyBytes, "DES");
Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, secretKey);
return cipher.doFinal(plainBytes);
}
// 将字节数组转换为十六进制字符串
private static String bytesToHex(byte[] bytes) {
StringBuilder sb = new StringBuilder();
for (byte b : bytes) {
sb.append(String.format("%02x", b));
}
return sb.toString();
}
}
上述代码首先生成一个DES密钥,然后使用该密钥对明文进行加密。加密时使用了ECB模式和PKCS5Padding填充方式。最后,将加密后的结果转换为十六进制字符串并输出。
DES解密示例
下面是一个使用DES算法进行解密的示例代码:
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
public class DESDemo {
public static void main(String[] args) throws Exception {
// 密钥
byte[] keyBytes = hexToBytes("0123456789abcdef");
// 密文
byte[] encryptedBytes = hexToBytes("a9b64a6a3b1a0e9b");
// 解密
byte[] decryptedBytes = decrypt(encryptedBytes, keyBytes);
// 打印解密后的结果
System.out.println("Decrypted: " + new String(decryptedBytes, StandardCharsets.UTF_8));
}
// 解密
private static byte[] decrypt(byte[] encryptedBytes, byte[] keyBytes) throws Exception {
SecretKey secretKey = new SecretKeySpec(keyBytes, "DES");
Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, secretKey);
return cipher.doFinal(encryptedBytes);
}
// 将十六进制字符串转换为字节数组
private static byte[] hexToBytes(String hexString) {
int len = hexString.length();
byte[] bytes = new byte[len / 2];
for (int i = 0; i < len; i += 2) {
bytes[i / 2] = (byte) ((Character.digit(hexString.charAt(i), 16) << 4)
+ Character.digit(hexString.charAt(i + 1), 16));
}
return bytes;
}
}
上述代码首先将密钥和密文转换为字节数组,然后使用密钥对密文进行解密。解密时同样使用了ECB模式和PKCS5Padding填充方式。最后,将解密后的字节数组转换为字符串并输出。
总结
本文介绍了Java中使用DES算法进行加解密的方法。我们可以使用javax.crypto
包中的Cipher
类来实现加解密功能,并可以通过定