Java AES-256 加密实现
AES (Advanced Encryption Standard) 是一种对称加密算法,AES-256 使用 256 位密钥,以下是 Java 中实现 AES-256 加密的完整示例代码。

基本实现
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.security.SecureRandom;
import java.util.Base64;
public class AES256Encryption {
// AES-256 需要 32 字节的密钥
private static final int KEY_SIZE = 256;
private static final String ALGORITHM = "AES";
private static final String TRANSFORMATION = "AES/CBC/PKCS5Padding";
private static final int IV_SIZE = 16; // AES 块大小为 16 字节
/**
* 生成 AES-256 密钥
*/
public static String generateKey() throws Exception {
KeyGenerator keyGenerator = KeyGenerator.getInstance(ALGORITHM);
keyGenerator.init(KEY_SIZE);
SecretKey secretKey = keyGenerator.generateKey();
return Base64.getEncoder().encodeToString(secretKey.getEncoded());
}
/**
* 生成初始化向量 (IV)
*/
public static String generateIV() {
byte[] iv = new byte[IV_SIZE];
new SecureRandom().nextBytes(iv);
return Base64.getEncoder().encodeToString(iv);
}
/**
* 加密
*/
public static String encrypt(String data, String key, String iv) throws Exception {
SecretKeySpec secretKeySpec = new SecretKeySpec(Base64.getDecoder().decode(key), ALGORITHM);
IvParameterSpec ivParameterSpec = new IvParameterSpec(Base64.getDecoder().decode(iv));
Cipher cipher = Cipher.getInstance(TRANSFORMATION);
cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, ivParameterSpec);
byte[] encrypted = cipher.doFinal(data.getBytes(StandardCharsets.UTF_8));
return Base64.getEncoder().encodeToString(encrypted);
}
/**
* 解密
*/
public static String decrypt(String encryptedData, String key, String iv) throws Exception {
SecretKeySpec secretKeySpec = new SecretKeySpec(Base64.getDecoder().decode(key), ALGORITHM);
IvParameterSpec ivParameterSpec = new IvParameterSpec(Base64.getDecoder().decode(iv));
Cipher cipher = Cipher.getInstance(TRANSFORMATION);
cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, ivParameterSpec);
byte[] decoded = Base64.getDecoder().decode(encryptedData);
byte[] decrypted = cipher.doFinal(decoded);
return new String(decrypted, StandardCharsets.UTF_8);
}
public static void main(String[] args) {
try {
// 生成密钥和IV
String key = generateKey();
String iv = generateIV();
System.out.println("Generated Key: " + key);
System.out.println("Generated IV: " + iv);
// 原始数据
String originalData = "这是一个需要加密的敏感数据";
System.out.println("Original Data: " + originalData);
// 加密
String encryptedData = encrypt(originalData, key, iv);
System.out.println("Encrypted Data: " + encryptedData);
// 解密
String decryptedData = decrypt(encryptedData, key, iv);
System.out.println("Decrypted Data: " + decryptedData);
} catch (Exception e) {
e.printStackTrace();
}
}
}
使用固定密钥和IV的简化版本
如果你有固定的密钥和IV,可以使用以下简化版本:
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.util.Base64;
public class AES256SimpleExample {
// 固定密钥 (32字节) - 实际应用中应从安全的地方获取
private static final String FIXED_KEY = "ThisIsASecretKeyForAES256Encryption";
// 固定IV (16字节)
private static final String FIXED_IV = "FixedInitializationV";
public static String encrypt(String data) throws Exception {
SecretKeySpec secretKeySpec = new SecretKeySpec(FIXED_KEY.getBytes(StandardCharsets.UTF_8), "AES");
IvParameterSpec ivParameterSpec = new IvParameterSpec(FIXED_IV.getBytes(StandardCharsets.UTF_8));
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, ivParameterSpec);
byte[] encrypted = cipher.doFinal(data.getBytes(StandardCharsets.UTF_8));
return Base64.getEncoder().encodeToString(encrypted);
}
public static String decrypt(String encryptedData) throws Exception {
SecretKeySpec secretKeySpec = new SecretKeySpec(FIXED_KEY.getBytes(StandardCharsets.UTF_8), "AES");
IvParameterSpec ivParameterSpec = new IvParameterSpec(FIXED_IV.getBytes(StandardCharsets.UTF_8));
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, ivParameterSpec);
byte[] decoded = Base64.getDecoder().decode(encryptedData);
byte[] decrypted = cipher.doFinal(decoded);
return new String(decrypted, StandardCharsets.UTF_8);
}
public static void main(String[] args) {
try {
String originalData = "这是一个需要加密的敏感数据";
System.out.println("Original Data: " + originalData);
String encryptedData = encrypt(originalData);
System.out.println("Encrypted Data: " + encryptedData);
String decryptedData = decrypt(encryptedData);
System.out.println("Decrypted Data: " + decryptedData);
} catch (Exception e) {
e.printStackTrace();
}
}
}
重要注意事项
-
密钥管理:在实际应用中,密钥应该安全存储,不要硬编码在代码中,可以使用密钥管理系统或从安全配置中获取。
-
IV 使用:每次加密都应该使用新的随机IV,不要重复使用相同的IV。
-
填充模式:示例中使用的是 PKCS5Padding,也可以使用 PKCS7Padding 或 NoPadding(需要处理数据长度)。
(图片来源网络,侵删) -
异常处理:加密解密过程中可能抛出各种异常,应该妥善处理。
-
性能考虑:对于大量数据,可以考虑使用流式加密而不是一次性加密整个数据。
-
安全性:确保使用足够强度的随机数生成器来生成密钥和IV。
-
算法强度:AES-256 是目前最强大的 AES 变体,但需要确保 Java 运行环境支持它(通常默认支持)。
(图片来源网络,侵删)
代码提供了基本的 AES-256 加密解密功能,可以根据实际需求进行调整。
