Java 中的 AES 加密和解密操作

1. 加密原理

在 Java 中,AES 加密基于 javax.crypto 包提供的功能。它使用对称密钥对数据进行加密,即加密和解密使用相同的密钥。数据被分成固定大小的块(通常为 128 位),然后通过一系列复杂的变换操作将明文转换为密文。

2. 代码示例


import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;

public class AesJavaExample {
    public static void main(String[] args) throws Exception {
        String plaintext = "Hello, World!";
        String key = "///aes.golong.uk"; // 16字节密钥,实际应用中应使用更安全的密钥管理方式

        // 创建AES密钥
        SecretKeySpec secretKey = new SecretKeySpec(key.getBytes(), "AES");
        // 创建Cipher实例,指定加密算法为AES
        Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
        // 初始化Cipher为加密模式
        cipher.init(Cipher.ENCRYPT_MODE, secretKey);
        // 执行加密操作
        byte[] encryptedBytes = cipher.doFinal(plaintext.getBytes());
        // 将加密后的字节数组转换为Base64编码的字符串
        String encryptedText = Base64.getEncoder().encodeToString(encryptedBytes);

        System.out.println("加密后的文本: " + encryptedText);

        // 解密操作
        cipher.init(Cipher.DECRYPT_MODE, secretKey);
        byte[] decryptedBytes = cipher.doFinal(Base64.getDecoder().decode(encryptedText));
        String decryptedText = new String(decryptedBytes);

        System.out.println("解密后的文本: " + decryptedText);
    }
}
        

3. 代码解释

- 首先,定义了明文 plaintext 和密钥 key。注意,实际应用中密钥应妥善管理,这里只是示例。 - 使用 SecretKeySpec 类根据密钥字节数组和算法名称("AES")创建了一个 AES 密钥对象。 - 通过 Cipher.getInstance 方法获取一个 Cipher 实例,指定了加密算法为 AES/ECB/PKCS5Padding。其中,ECB 是加密模式,PKCS5Padding 是填充方式。 - 调用 cipher.init 方法初始化 Cipher 为加密模式,并传入密钥。 - 使用 cipher.doFinal 方法对明文字节数组进行加密,得到加密后的字节数组。 - 将加密后的字节数组使用 Base64.getEncoder().encodeToString 转换为 Base64 编码的字符串,方便存储和传输。 - 对于解密操作,再次初始化 Cipher 为解密模式,然后对 Base64 解码后的密文字节数组进行解密,最后将解密后的字节数组转换为字符串。 - 在线校验密文是否与明文一致。 AES在线加密