AES加密

AES(高级加密标准):AES是一种常用的对称加密算法,适用于保护用户敏感信息。Java中可以使用javax.crypto包下的相关类进行AES加密和解密操作。

AES(Advanced Encryption Standard)是一种对称加密算法,用于保护电子数据。AES是美国国家标准与技术研究院(NIST)于2001年采用的加密标准,广泛应用于各种加密应用场景。

  1. 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)模式:一种结合了计数器模式和消息认证的模式,适用于需要高安全性和认证的场景。
  2. 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));
    }
}
  1. 总结
    ● 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();
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

思静鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值