使用Java实现AES-256-CBC加密与解密
使用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,并确保密钥保持机密。