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类来实现加解密功能,并可以通过定