实现 AES 可逆加密的 Java 教程

在现代应用程序中,加密数据是保护用户隐私和安全的重要措施。AES(高级加密标准)是一种常见的对称加密算法,其中加密和解密使用相同的密钥。本文将帮助你理解如何在 Java 中实现 AES 的可逆加密,并逐步引导你完成代码实现。

加密与解密流程

在开始编码之前,我们要了解整个加密和解密的流程。以下是 AES 加密和解密的基本步骤:

步骤 描述
1. 选择密钥 选择一个合适长度的密钥 (128/192/256 位)
2. 初始化算法 使用 Cipher 类初始化 AES 加密算法
3. 加密数据 将明文数据作为输入,使用密钥进行加密
4. 解密数据 将密文数据作为输入,使用相同的密钥进行解密
5. 处理结果 输出结果:加密后的字符串和解密后的明文

类图

我们将根据上面的步骤创建一个简单的 AESCrypt 类,该类将包含加密和解密的方法。

classDiagram
    class AESCrypt {
        +String encrypt(String data, String key)
        +String decrypt(String encryptedData, String key)
    }

实现代码

接下来,我们可以实现 AESCrypt 类。以下是实现 AES 加密和解密的代码。

import javax.crypto.Cipher; // 用于加密算法
import javax.crypto.KeyGenerator; // 用于生成密钥
import javax.crypto.SecretKey; // 用于表示密钥
import javax.crypto.spec.SecretKeySpec; // 用于指定密钥的特征
import java.util.Base64; // 用于Base64编码和解码

public class AESCrypt {

    // AES加密方法
    public String encrypt(String data, String key) throws Exception {
        // 使用指定的密钥生成AES密钥
        SecretKeySpec secretKey = new SecretKeySpec(key.getBytes(), "AES");

        // 创建Cipher对象并初始化为加密模式
        Cipher cipher = Cipher.getInstance("AES");
        cipher.init(Cipher.ENCRYPT_MODE, secretKey);

        // 加密数据并返回Base64编码的结果
        byte[] encryptedData = cipher.doFinal(data.getBytes());
        return Base64.getEncoder().encodeToString(encryptedData);
    }

    // AES解密方法
    public String decrypt(String encryptedData, String key) throws Exception {
        // 使用指定的密钥生成AES密钥
        SecretKeySpec secretKey = new SecretKeySpec(key.getBytes(), "AES");

        // 创建Cipher对象并初始化为解密模式
        Cipher cipher = Cipher.getInstance("AES");
        cipher.init(Cipher.DECRYPT_MODE, secretKey);

        // 解密数据并返回字符串结果
        byte[] decodedData = Base64.getDecoder().decode(encryptedData);
        byte[] originalData = cipher.doFinal(decodedData);
        return new String(originalData);
    }
}

代码解释

  1. import语句:引入所需的加密类。
  2. AESCrypt类:主类,包含加密和解密方法。
  3. encrypt方法:
    • 使用给定的密钥创建AES密钥。
    • 创建Cipher对象,并将其初始化为加密模式。
    • 对输入数据进行加密,结果用Base64编码。
  4. decrypt方法:
    • 类似地使用密钥进行解密,将解密后的字节转换为字符串。

使用示例

以下是如何使用 AESCrypt 类进行加密和解密的示例代码。

public class Main {
    public static void main(String[] args) {
        try {
            // 输入需要加密的文本和密钥
            String originalText = "Hello, World!";
            String key = "1234567890123456"; // 16 字符的密钥

            // 创建 AESCrypt 实例
            AESCrypt aesCrypt = new AESCrypt();

            // 执行加密
            String encryptedText = aesCrypt.encrypt(originalText, key);
            System.out.println("Encrypted: " + encryptedText);

            // 执行解密
            String decryptedText = aesCrypt.decrypt(encryptedText, key);
            System.out.println("Decrypted: " + decryptedText);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

示例代码解释

  1. 定义原始文本和密钥。确保密钥长度为16个字符(即128位)。
  2. 创建 AESCrypt 类的实例。
  3. 调用 encrypt 方法对原始文本进行加密,并输出结果。
  4. 调用 decrypt 方法对加密后的文本进行解密,并输出解密结果。

序列图

以下是加密和解密过程的序列图。

sequenceDiagram
    participant User as 用户
    participant AESCrypt as AESCrypt

    User->>AESCrypt: encrypt(data, key)
    AESCrypt->>User: encryptedData

    User->>AESCrypt: decrypt(encryptedData, key)
    AESCrypt->>User: originalData

结尾

在本文中,我们学习了如何在 Java 中实现 AES 可逆加密,包括加密和解密的完整过程和相关代码。确保你在使用时密钥的安全性,以防止数据泄露。通过本教程,你应该能够实现 AES 加密的基础功能,并在实际项目中为敏感数据提供保护。这只是加密领域的第一步,更多的安全措施和技术等待你去探索!