AES(高级加密标准):AES是一种常用的对称加密算法,适用于保护用户敏感信息。Java中可以使用javax.crypto包下的相关类进行AES加密和解密操作。
AES(Advanced Encryption Standard)是一种对称加密算法,用于保护电子数据。AES是美国国家标准与技术研究院(NIST)于2001年采用的加密标准,广泛应用于各种加密应用场景。
- AES算法的基本原理
1.1. 对称加密
● 对称加密:加密和解密使用相同的密钥,这意味着通信双方必须共享同一个密钥。
1.2. AES的工作模式
AES支持128位、192位和256位的密钥长度,处理的数据块大小固定为128位。AES通常与不同的工作模式结合使用,以实现更灵活的加密方式。常见的工作模式有:
● ECB(Electronic Codebook)模式:最简单的模式,直接对每个数据块加密,但容易受到模式攻击,不推荐使用。
● CBC(Cipher Block Chaining)模式:每个数据块与前一个加密后的数据块进行异或运算,确保相同的明文块加密后会产生不同的密文。
● CFB(Cipher Feedback)模式:将前一块密文作为反馈输入,用于加密下一个明文块。
● OFB(Output Feedback)模式:生成一个加密流,与明文进行异或运算来生成密文。
● GCM(Galois/Counter Mode)模式:一种结合了计数器模式和消息认证的模式,适用于需要高安全性和认证的场景。 - Java中的AES实现
2.1. 基本AES加密与解密(CBC模式)
以下示例展示了如何使用Java进行AES加密和解密,使用CBC模式并带有初始化向量(IV)。
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.security.SecureRandom;
import java.util.Base64;
public class AESExample {
public static void main(String[] args) throws Exception {
// 生成密钥
KeyGenerator keyGen = KeyGenerator.getInstance("AES");
keyGen.init(128); // 可以是128, 192, 256位
SecretKey secretKey = keyGen.generateKey();
// 生成初始化向量 (IV)
byte[] iv = new byte[16];
SecureRandom random = new SecureRandom();
random.nextBytes(iv);
IvParameterSpec ivSpec = new IvParameterSpec(iv);
// 待加密的消息
String message = "Hello, AES!";
// 加密
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, secretKey, ivSpec);
byte[] encryptedMessage = cipher.doFinal(message.getBytes());
String encodedEncryptedMessage = Base64.getEncoder().encodeToString(encryptedMessage);
String encodedIv = Base64.getEncoder().encodeToString(iv);
System.out.println("Encrypted Message: " + encodedEncryptedMessage);
System.out.println("IV: " + encodedIv);
// 解密
cipher.init(Cipher.DECRYPT_MODE, secretKey, ivSpec);
byte[] decryptedMessage = cipher.doFinal(Base64.getDecoder().decode(encodedEncryptedMessage));
System.out.println("Decrypted Message: " + new String(decryptedMessage));
}
}
2.2. AES加密与解密(GCM模式)
GCM模式提供加密和消息认证功能,适合在需要保证数据完整性的场景中使用。
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.GCMParameterSpec;
import java.security.SecureRandom;
import java.util.Base64;
public class AESGCMExample {
public static void main(String[] args) throws Exception {
// 生成密钥
KeyGenerator keyGen = KeyGenerator.getInstance("AES");
keyGen.init(256); // GCM模式建议使用256位密钥
SecretKey secretKey = keyGen.generateKey();
// 生成初始化向量 (IV)
byte[] iv = new byte[12];
SecureRandom random = new SecureRandom();
random.nextBytes(iv);
GCMParameterSpec gcmSpec = new GCMParameterSpec(128, iv); // 128位认证标签
// 待加密的消息
String message = "Hello, AES-GCM!";
// 加密
Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding");
cipher.init(Cipher.ENCRYPT_MODE, secretKey, gcmSpec);
byte[] encryptedMessage = cipher.doFinal(message.getBytes());
String encodedEncryptedMessage = Base64.getEncoder().encodeToString(encryptedMessage);
String encodedIv = Base64.getEncoder().encodeToString(iv);
System.out.println("Encrypted Message: " + encodedEncryptedMessage);
System.out.println("IV: " + encodedIv);
// 解密
cipher.init(Cipher.DECRYPT_MODE, secretKey, gcmSpec);
byte[] decryptedMessage = cipher.doFinal(Base64.getDecoder().decode(encodedEncryptedMessage));
System.out.println("Decrypted Message: " + new String(decryptedMessage));
}
}
- 总结
● AES的安全性:AES是一种非常安全的加密算法,广泛应用于各种安全协议和数据保护场景。选择合适的密钥长度和工作模式至关重要。
● Java实现:Java提供了强大的加密库javax.crypto,支持AES算法的实现和多种工作模式的使用。结合不同的模式,可以实现加密、解密以及数据的完整性保护。
通过上述Java样例代码,可以有效地在应用程序中实现AES加密与解密。
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import java.nio.charset.StandardCharsets;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
public class AESEncryptionExample {
public static void main(String[] args) {
String input = "身份证号";
try {
// 生成AES密钥
KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
SecureRandom secureRandom = new SecureRandom();
keyGenerator.init(256, secureRandom);
SecretKey secretKey = keyGenerator.generateKey();
// 创建Cipher对象,指定加密算法和工作模式
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.ENCRYPT_MODE, secretKey);
// 加密数据
byte[] encryptedBytes = cipher.doFinal(input.getBytes(StandardCharsets.UTF_8));
// 将字节数组转换为十六进制字符串
StringBuilder hexString = new StringBuilder();
for (byte b : encryptedBytes) {
String hex = Integer.toHexString(0xff & b);
if (hex.length() == 1) {
hexString.append('0');
}
hexString.append(hex);
}
// 打印加密后的字符串
System.out.println(hexString.toString());
} catch (Exception e) {
e.printStackTrace();
}
}
}