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: