Java AES 动态生成秘钥
AES(Advanced Encryption Standard)是一种常用的对称加密算法,它被广泛应用于数据保护和数据安全领域。在Java中,我们可以使用javax.crypto包提供的API来实现AES加密和解密。本文将介绍如何在Java中动态生成AES秘钥,并提供代码示例进行说明。
AES加密算法简介
AES是一种对称加密算法,它使用相同的密钥进行加密和解密。密钥可以是128位(16字节)、192位(24字节)或256位(32字节)长度。AES算法使用一个固定长度的数据块(128位)进行加密和解密,即使明文长度不足128位,也会被填充到128位进行处理。
AES加密算法主要包括4个步骤:密钥扩展、轮密钥加、字节替换和行移位。密钥扩展将输入密钥扩展为多个轮密钥,轮密钥加将每轮的轮密钥与数据块进行异或运算,字节替换通过查表替换数据块中的字节,行移位将数据块中的每行进行循环移位操作。
动态生成AES秘钥
在Java中,我们可以使用javax.crypto.KeyGenerator类来动态生成AES秘钥。KeyGenerator类提供了生成指定算法和密钥长度的密钥的方法。对于AES算法,我们可以使用AES算法对应的KeyGenerator实例来生成秘钥。
以下是一个动态生成AES秘钥的示例代码:
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import java.security.NoSuchAlgorithmException;
public class AESKeyGenerator {
public static SecretKey generateKey() throws NoSuchAlgorithmException {
KeyGenerator keyGen = KeyGenerator.getInstance("AES");
keyGen.init(256); // 使用256位长度的密钥
return keyGen.generateKey();
}
public static void main(String[] args) throws NoSuchAlgorithmException {
SecretKey secretKey = generateKey();
System.out.println("Generated AES key: " + secretKey);
}
}
在上述代码中,我们首先通过调用KeyGenerator.getInstance("AES")获取AES算法对应的KeyGenerator实例,然后使用KeyGenerator的init方法指定密钥长度(这里使用256位长度的密钥),最后调用KeyGenerator的generateKey方法生成秘钥。
AES加密和解密示例
生成AES秘钥之后,我们可以使用javax.crypto.Cipher类来进行AES加密和解密操作。Cipher类提供了诸如AES/CBC/PKCS5Padding等加密算法和填充方式的实现。
以下是一个使用AES算法进行加密和解密的示例代码:
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.security.NoSuchAlgorithmException;
import java.util.Base64;
public class AESEncryption {
private static final String ALGORITHM = "AES/CBC/PKCS5Padding";
private static final String KEY = "0123456789abcdef";
private static final String IV = "fedcba9876543210";
public static String encrypt(String plainText) throws Exception {
SecretKey secretKey = new SecretKeySpec(KEY.getBytes(), "AES");
IvParameterSpec ivParameterSpec = new IvParameterSpec(IV.getBytes());
Cipher cipher = Cipher.getInstance(ALGORITHM);
cipher.init(Cipher.ENCRYPT_MODE, secretKey, ivParameterSpec);
byte[] encryptedBytes = cipher.doFinal(plainText.getBytes());
return Base64.getEncoder().encodeToString(encryptedBytes);
}
public static String decrypt(String encryptedText) throws Exception {
SecretKey secretKey = new SecretKeySpec(KEY.getBytes(), "AES");
IvParameterSpec ivParameterSpec = new IvParameterSpec(IV.getBytes());
Cipher cipher = Cipher.getInstance(ALGORITHM);
cipher.init(Cipher.DECRYPT_MODE, secretKey, ivParameterSpec);
byte[] encryptedBytes = Base64.getDecoder().decode(encryptedText);
byte[] decryptedBytes = cipher.doFinal(encryptedBytes);
return new String(decryptedBytes);
}
public static void main(String[] args) throws Exception {
String plainText = "Hello, World!";
String encryptedText = encrypt(plainText);
String decryptedText = decrypt(encryptedText);
System.out.println("Plain Text: " + plainText);
System.out.println("Encrypted Text: " + encryptedText);
System.out.println("Decrypted Text: