杰瑞科技汇

Java AES 256加密如何实现?

Java AES-256 加密实现

AES (Advanced Encryption Standard) 是一种对称加密算法,AES-256 使用 256 位密钥,以下是 Java 中实现 AES-256 加密的完整示例代码。

Java AES 256加密如何实现?-图1
(图片来源网络,侵删)

基本实现

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.security.SecureRandom;
import java.util.Base64;
public class AES256Encryption {
    // AES-256 需要 32 字节的密钥
    private static final int KEY_SIZE = 256;
    private static final String ALGORITHM = "AES";
    private static final String TRANSFORMATION = "AES/CBC/PKCS5Padding";
    private static final int IV_SIZE = 16; // AES 块大小为 16 字节
    /**
     * 生成 AES-256 密钥
     */
    public static String generateKey() throws Exception {
        KeyGenerator keyGenerator = KeyGenerator.getInstance(ALGORITHM);
        keyGenerator.init(KEY_SIZE);
        SecretKey secretKey = keyGenerator.generateKey();
        return Base64.getEncoder().encodeToString(secretKey.getEncoded());
    }
    /**
     * 生成初始化向量 (IV)
     */
    public static String generateIV() {
        byte[] iv = new byte[IV_SIZE];
        new SecureRandom().nextBytes(iv);
        return Base64.getEncoder().encodeToString(iv);
    }
    /**
     * 加密
     */
    public static String encrypt(String data, String key, String iv) throws Exception {
        SecretKeySpec secretKeySpec = new SecretKeySpec(Base64.getDecoder().decode(key), ALGORITHM);
        IvParameterSpec ivParameterSpec = new IvParameterSpec(Base64.getDecoder().decode(iv));
        Cipher cipher = Cipher.getInstance(TRANSFORMATION);
        cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, ivParameterSpec);
        byte[] encrypted = cipher.doFinal(data.getBytes(StandardCharsets.UTF_8));
        return Base64.getEncoder().encodeToString(encrypted);
    }
    /**
     * 解密
     */
    public static String decrypt(String encryptedData, String key, String iv) throws Exception {
        SecretKeySpec secretKeySpec = new SecretKeySpec(Base64.getDecoder().decode(key), ALGORITHM);
        IvParameterSpec ivParameterSpec = new IvParameterSpec(Base64.getDecoder().decode(iv));
        Cipher cipher = Cipher.getInstance(TRANSFORMATION);
        cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, ivParameterSpec);
        byte[] decoded = Base64.getDecoder().decode(encryptedData);
        byte[] decrypted = cipher.doFinal(decoded);
        return new String(decrypted, StandardCharsets.UTF_8);
    }
    public static void main(String[] args) {
        try {
            // 生成密钥和IV
            String key = generateKey();
            String iv = generateIV();
            System.out.println("Generated Key: " + key);
            System.out.println("Generated IV: " + iv);
            // 原始数据
            String originalData = "这是一个需要加密的敏感数据";
            System.out.println("Original Data: " + originalData);
            // 加密
            String encryptedData = encrypt(originalData, key, iv);
            System.out.println("Encrypted Data: " + encryptedData);
            // 解密
            String decryptedData = decrypt(encryptedData, key, iv);
            System.out.println("Decrypted Data: " + decryptedData);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

使用固定密钥和IV的简化版本

如果你有固定的密钥和IV,可以使用以下简化版本:

import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.util.Base64;
public class AES256SimpleExample {
    // 固定密钥 (32字节) - 实际应用中应从安全的地方获取
    private static final String FIXED_KEY = "ThisIsASecretKeyForAES256Encryption";
    // 固定IV (16字节)
    private static final String FIXED_IV = "FixedInitializationV";
    public static String encrypt(String data) throws Exception {
        SecretKeySpec secretKeySpec = new SecretKeySpec(FIXED_KEY.getBytes(StandardCharsets.UTF_8), "AES");
        IvParameterSpec ivParameterSpec = new IvParameterSpec(FIXED_IV.getBytes(StandardCharsets.UTF_8));
        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
        cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, ivParameterSpec);
        byte[] encrypted = cipher.doFinal(data.getBytes(StandardCharsets.UTF_8));
        return Base64.getEncoder().encodeToString(encrypted);
    }
    public static String decrypt(String encryptedData) throws Exception {
        SecretKeySpec secretKeySpec = new SecretKeySpec(FIXED_KEY.getBytes(StandardCharsets.UTF_8), "AES");
        IvParameterSpec ivParameterSpec = new IvParameterSpec(FIXED_IV.getBytes(StandardCharsets.UTF_8));
        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
        cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, ivParameterSpec);
        byte[] decoded = Base64.getDecoder().decode(encryptedData);
        byte[] decrypted = cipher.doFinal(decoded);
        return new String(decrypted, StandardCharsets.UTF_8);
    }
    public static void main(String[] args) {
        try {
            String originalData = "这是一个需要加密的敏感数据";
            System.out.println("Original Data: " + originalData);
            String encryptedData = encrypt(originalData);
            System.out.println("Encrypted Data: " + encryptedData);
            String decryptedData = decrypt(encryptedData);
            System.out.println("Decrypted Data: " + decryptedData);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

重要注意事项

  1. 密钥管理:在实际应用中,密钥应该安全存储,不要硬编码在代码中,可以使用密钥管理系统或从安全配置中获取。

  2. IV 使用:每次加密都应该使用新的随机IV,不要重复使用相同的IV。

  3. 填充模式:示例中使用的是 PKCS5Padding,也可以使用 PKCS7Padding 或 NoPadding(需要处理数据长度)。

    Java AES 256加密如何实现?-图2
    (图片来源网络,侵删)
  4. 异常处理:加密解密过程中可能抛出各种异常,应该妥善处理。

  5. 性能考虑:对于大量数据,可以考虑使用流式加密而不是一次性加密整个数据。

  6. 安全性:确保使用足够强度的随机数生成器来生成密钥和IV。

  7. 算法强度:AES-256 是目前最强大的 AES 变体,但需要确保 Java 运行环境支持它(通常默认支持)。

    Java AES 256加密如何实现?-图3
    (图片来源网络,侵删)

代码提供了基本的 AES-256 加密解密功能,可以根据实际需求进行调整。

分享:
扫描分享到社交APP
上一篇
下一篇