使用Java实现AES-256-CBC加密与解密

AES-256-CBC (Cipher Block Chaining) 是一种流行的加密方法,常用于数据加密。以下是如何在Java中实现此算法的详细步骤。

生成随机的初始化向量 (IV)

使用 Java 的 SecureRandom 类可以轻松生成随机的IV。例如,对于 AES-CBC 模式,通常需要一个16字节的IV:

import java.security.SecureRandom;

private static final int IV_SIZE = 16;

public static byte[] generateRandomIv() {
    byte[] iv = new byte[IV_SIZE];
    SecureRandom secureRandom = new SecureRandom();
    secureRandom.nextBytes(iv);
    return iv;
}

AES-256-CBC加密

为了加密数据,可以使用Java的 Cipher 类。以下是一个简单的加密示例:

import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.util.Base64;

private static final String AES_CBC_PADDING = "AES/CBC/PKCS5Padding";
private static final String KEY = "key";  // 注意: 仅作示例,实际应用应采用更复杂的密钥。

public static String encrypt(String data, byte[] iv) throws Exception {
    SecretKeySpec keySpec = new SecretKeySpec(KEY.getBytes(StandardCharsets.UTF_8), "AES");
    IvParameterSpec ivSpec = new IvParameterSpec(iv);
    Cipher cipher = Cipher.getInstance(AES_CBC_PADDING);
    cipher.init(Cipher.ENCRYPT_MODE, keySpec, ivSpec);
    byte[] encryptedData = cipher.doFinal(data.getBytes(StandardCharsets.UTF_8));
    return Base64.getEncoder().encodeToString(encryptedData);
}

AES-256-CBC解密

解密是加密的逆过程。下面是如何使用给定的密钥和IV进行解密的示例:

public static String decrypt(String encryptedData, byte[] iv) throws Exception {
    SecretKeySpec keySpec = new SecretKeySpec(KEY.getBytes(StandardCharsets.UTF_8), "AES");
    IvParameterSpec ivSpec = new IvParameterSpec(iv);
    Cipher cipher = Cipher.getInstance(AES_CBC_PADDING);
    cipher.init(Cipher.DECRYPT_MODE, keySpec, ivSpec);
    byte[] decryptedData = cipher.doFinal(Base64.getDecoder().decode(encryptedData));
    return new String(decryptedData, StandardCharsets.UTF_8);
}

总结

实现AES-256-CBC加密和解密在Java中是直观的。重要的是始终确保使用安全的方法生成和存储密钥及IV,并确保密钥保持机密。