AES(高级加密标准)是一种广泛使用的对称加密算法,适用于数据的加密和解密。在Java中,我们可以使用Java Cryptography Architecture (JCA)来实现AES加密和解密。下面将介绍如何在Java中实现AES加密和解密,并提供完整的代码示例。
AES加密与解密的步骤
- 生成密钥:AES密钥通常为128位、192位或256位。
- 初始化Cipher对象:选择加密算法和模式。
- 加密数据:使用密钥和Cipher对象对数据进行加密。
- 解密数据:使用相同的密钥对数据进行解密。
代码示例
下面是一个完整的Java示例,展示了如何使用AES算法进行加密和解密。
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import javax.crypto.spec.IvParameterSpec;
import java.util.Base64;
public class AESCryptography {
private static final String ALGORITHM = "AES";
private static final String TRANSFORMATION = "AES/CBC/PKCS5Padding";
private static final String IV = "1234567890123456"; // 16 bytes for AES
// 生成密钥
public static SecretKey generateKey() throws Exception {
KeyGenerator keyGenerator = KeyGenerator.getInstance(ALGORITHM);
keyGenerator.init(128); // 密钥长度可为128, 192, 256
return keyGenerator.generateKey();
}
// 加密
public static String encrypt(String data, SecretKey key) throws Exception {
Cipher cipher = Cipher.getInstance(TRANSFORMATION);
IvParameterSpec ivParams = new IvParameterSpec(IV.getBytes());
cipher.init(Cipher.ENCRYPT_MODE, key, ivParams);
byte[] encryptedBytes = cipher.doFinal(data.getBytes());
return Base64.getEncoder().encodeToString(encryptedBytes);
}
// 解密
public static String decrypt(String encryptedData, SecretKey key) throws Exception {
Cipher cipher = Cipher.getInstance(TRANSFORMATION);
IvParameterSpec ivParams = new IvParameterSpec(IV.getBytes());
cipher.init(Cipher.DECRYPT_MODE, key, ivParams);
byte[] decryptedBytes = cipher.doFinal(Base64.getDecoder().decode(encryptedData));
return new String(decryptedBytes);
}
public static void main(String[] args) {
try {
String originalData = "Hello, AES Encryption!";
// 生成密钥
SecretKey secretKey = generateKey();
// 加密
String encryptedData = encrypt(originalData, secretKey);
System.out.println("加密后的数据: " + encryptedData);
// 解密
String decryptedData = decrypt(encryptedData, secretKey);
System.out.println("解密后的数据: " + decryptedData);
} catch (Exception e) {
e.printStackTrace();
}
}
}
代码解析
- 生成密钥:使用
KeyGenerator
生成一个128位的AES密钥。 - 加密方法:通过
Cipher
对象进行数据加密。使用CBC模式和PKCS5填充, 并通过IvParameterSpec
设置初始化向量(IV)。加密后的数据通过Base64编码为字符串。 - 解密方法:解密过程与加密类似,先创建Cipher对象并初始化为解密模式,解密后再将Base64编码的数据转换为字符串。
重要提示
- 加密密钥必须安全存储,泄露可能导致数据被未经授权访问。
- IV的长度对AES加密算法至关重要,必须是16字节。
- 在实际应用中,对于密钥管理和IV生成,应该采用符合安全标准的方法,不要硬编码到代码中。
结论
上述代码示例展示了如何在Java中使用AES算法进行数据的加密和解密。AES加密是一种强有力的加密方法,广泛应用于数据保护领域。希望通过这个示例,您能够更好地理解AES加密和解密的基本概念及实现方法。