AES(高级加密标准)是一种对称加密算法,是现代加密技术中最常用的加密算法之一。它的设计初衷是为了替代老旧的DES(数据加密标准),其主要特点是加密速度快、安全性高,且能够处理不同大小的块。
AES的基本概念
AES是一种对称加密算法,这意味着在加密和解密过程中使用相同的密钥。AES支持128位、192位和256位的密钥长度,常见的使用是128位密钥。AES算法的基本操作是将明文划分为128位的块,然后通过多轮处理后生成密文。
AES的工作流程
AES加密主要包括以下几个步骤:
- 密钥扩展:将原始密钥扩展为一系列轮密钥。
- 初始轮:将明文与第一个轮密钥进行异或操作。
- 主轮(进行多次):包括四个主要操作:
- 字节替换(SubBytes):使用S-Box替换字节。
- 行移位(ShiftRows):对行进行循环移位。
- 列混合(MixColumns):对列进行混合运算。
- 轮密钥加(AddRoundKey):将当前状态与轮密钥进行异或操作。
- 最后轮:去掉“列混合”步骤,进行最终的轮密钥加。
Java实现AES
以下是一个简单的Java示例,展示如何使用AES进行加密和解密。
Maven依赖
如果你使用Maven管理项目,请在pom.xml
中添加以下依赖:
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcpkix-jdk15on</artifactId>
<version>1.69</version>
</dependency>
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 AESCrypt {
private static final String ALGORITHM = "AES";
private static final String TRANSFORMATION = "AES/CBC/PKCS5Padding"; // 使用CBC模式和PKCS5填充
private static final String SECRET_KEY = "1234567890123456"; // 16字节的密钥
public static void main(String[] args) throws Exception {
String originalString = "Hello, AES!";
String encryptedString = encrypt(originalString, SECRET_KEY);
String decryptedString = decrypt(encryptedString, SECRET_KEY);
System.out.println("原文: " + originalString);
System.out.println("加密后: " + encryptedString);
System.out.println("解密后: " + decryptedString);
}
public static String encrypt(String data, String secret) throws Exception {
SecretKeySpec secretKey = new SecretKeySpec(secret.getBytes(), ALGORITHM);
Cipher cipher = Cipher.getInstance(TRANSFORMATION);
// 初始化向量,可以更换
IvParameterSpec ivParams = new IvParameterSpec(secret.getBytes(), 0, 16);
cipher.init(Cipher.ENCRYPT_MODE, secretKey, ivParams);
byte[] encrypted = cipher.doFinal(data.getBytes());
return Base64.getEncoder().encodeToString(encrypted);
}
public static String decrypt(String encryptedData, String secret) throws Exception {
SecretKeySpec secretKey = new SecretKeySpec(secret.getBytes(), ALGORITHM);
Cipher cipher = Cipher.getInstance(TRANSFORMATION);
IvParameterSpec ivParams = new IvParameterSpec(secret.getBytes(), 0, 16);
cipher.init(Cipher.DECRYPT_MODE, secretKey, ivParams);
byte[] original = cipher.doFinal(Base64.getDecoder().decode(encryptedData));
return new String(original);
}
}
代码解释
-
密钥生成:在示例中,我们直接使用一个预定义的密钥(
SECRET_KEY
),通常在实际应用中应通过安全渠道生成和管理密钥。 -
CBC模式:该示例使用CBC(Cipher Block Chaining)模式,要求使用一个初始向量(IV)。在本示例中,IV与密钥相同,但在真实开发中应使用随机生成的IV。
-
加密解密:使用
Cipher
类进行加密和解密,分别调用doFinal()
方法。
注意事项
- AES密钥应当安全存储和管理,避免泄露。
- CBC模式需要一个随机生成的IV,以提高安全性,避免相同的明文加密为相同的密文。
- 适当处理异常,并根据实际需求完善代码。
通过正确实现AES,你可以有效地保护数据的安全,并避免未授权的访问。