📜  Java的对称加密密码术(1)

📅  最后修改于: 2023-12-03 15:02:05.704000             🧑  作者: Mango

Java的对称加密密码术

在软件开发中,数据的安全性是极为重要的。对称加密算法是常用的数据加密技术之一,它使用相同的密钥对数据进行加密和解密。Java提供了许多对称加密算法的实现,开发人员可以使用这些算法来保护敏感数据。

常用的对称加密算法

Java支持的常用对称加密算法包括以下几种:

  1. DES(Data Encryption Standard):已被认为是不安全的算法,不推荐使用。
  2. 3DES(Triple Data Encryption Standard):对DES算法的改进,提供更高的安全性。
  3. AES(Advanced Encryption Standard):目前最广泛使用的对称加密算法,具有高安全性和高性能。

另外,Java还支持其他一些对称加密算法,如RC2、RC4等,但由于安全性较低,一般不推荐使用。

Java中的对称加密实现

使用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;
import java.util.Base64;

public class DESExample {
    public static void main(String[] args) throws Exception {
        String plaintext = "Hello, world!";
        
        // 生成DES密钥
        SecretKey secretKey = generateDESKey();
        
        // 加密
        byte[] encryptedBytes = encryptDES(plaintext.getBytes(StandardCharsets.UTF_8), secretKey);
        String encryptedText = Base64.getEncoder().encodeToString(encryptedBytes);
        
        // 解密
        byte[] decryptedBytes = decryptDES(Base64.getDecoder().decode(encryptedText), secretKey);
        String decryptedText = new String(decryptedBytes, StandardCharsets.UTF_8);
        
        System.out.println("Plaintext: " + plaintext);
        System.out.println("Encrypted text: " + encryptedText);
        System.out.println("Decrypted text: " + decryptedText);
    }
    
    // 生成DES密钥
    public static SecretKey generateDESKey() throws NoSuchAlgorithmException {
        KeyGenerator keyGenerator = KeyGenerator.getInstance("DES");
        keyGenerator.init(56); // 生成56位密钥
        return keyGenerator.generateKey();
    }
    
    // 使用DES算法加密数据
    public static byte[] encryptDES(byte[] plaintext, SecretKey secretKey) throws Exception {
        Cipher cipher = Cipher.getInstance("DES");
        cipher.init(Cipher.ENCRYPT_MODE, secretKey);
        return cipher.doFinal(plaintext);
    }
    
    // 使用DES算法解密数据
    public static byte[] decryptDES(byte[] ciphertext, SecretKey secretKey) throws Exception {
        Cipher cipher = Cipher.getInstance("DES");
        cipher.init(Cipher.DECRYPT_MODE, secretKey);
        return cipher.doFinal(ciphertext);
    }
}

使用AES算法进行加密与解密

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;
import java.util.Base64;

public class AESExample {
    public static void main(String[] args) throws Exception {
        String plaintext = "Hello, world!";
        
        // 生成AES密钥
        SecretKey secretKey = generateAESKey();
        
        // 加密
        byte[] encryptedBytes = encryptAES(plaintext.getBytes(StandardCharsets.UTF_8), secretKey);
        String encryptedText = Base64.getEncoder().encodeToString(encryptedBytes);
        
        // 解密
        byte[] decryptedBytes = decryptAES(Base64.getDecoder().decode(encryptedText), secretKey);
        String decryptedText = new String(decryptedBytes, StandardCharsets.UTF_8);
        
        System.out.println("Plaintext: " + plaintext);
        System.out.println("Encrypted text: " + encryptedText);
        System.out.println("Decrypted text: " + decryptedText);
    }
    
    // 生成AES密钥
    public static SecretKey generateAESKey() throws NoSuchAlgorithmException {
        KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
        keyGenerator.init(128); // 生成128位密钥
        return keyGenerator.generateKey();
    }
    
    // 使用AES算法加密数据
    public static byte[] encryptAES(byte[] plaintext, SecretKey secretKey) throws Exception {
        Cipher cipher = Cipher.getInstance("AES");
        cipher.init(Cipher.ENCRYPT_MODE, secretKey);
        return cipher.doFinal(plaintext);
    }
    
    // 使用AES算法解密数据
    public static byte[] decryptAES(byte[] ciphertext, SecretKey secretKey) throws Exception {
        Cipher cipher = Cipher.getInstance("AES");
        cipher.init(Cipher.DECRYPT_MODE, secretKey);
        return cipher.doFinal(ciphertext);
    }
}
总结

Java提供了各种对称加密算法的实现,开发人员可以根据实际需求选择合适的算法。在使用对称加密算法时,需要注意密钥的安全保管和传输,以确保数据的安全性。另外,对称加密算法通常适用于对较小数据块进行加密,对于大数据块,可以考虑使用分组模式和填充模式。在实际应用中,还可以结合非对称加密算法来实现更高级的安全机制。