Java AES CBC加密解密

简介

AES(Advanced Encryption Standard)是一种对称加密算法,常用于保护敏感数据的安全性。CBC(Cipher Block Chaining)是一种加密模式,通过将前一个明文块与当前明文块进行异或运算,然后再进行加密,提高了数据的安全性。

在Java中,我们可以使用javax.crypto包中的Cipher类来进行AES CBC加密和解密操作。本文将介绍如何使用Java进行AES CBC加密解密,并提供代码示例供参考。

AES CBC加密

AES CBC加密使用一个密钥和一个初始化向量(IV)来对数据进行加密。以下是一个简单的AES CBC加密示例代码:

import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;

public class AesCbcEncryption {
    public static byte[] encrypt(byte[] key, byte[] iv, byte[] data) throws Exception {
        SecretKeySpec secretKeySpec = new SecretKeySpec(key, "AES");
        IvParameterSpec ivParameterSpec = new IvParameterSpec(iv);

        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
        cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, ivParameterSpec);

        return cipher.doFinal(data);
    }

    public static void main(String[] args) throws Exception {
        byte[] key = "0123456789abcdef".getBytes(); // 16字节的密钥
        byte[] iv = "0123456789abcdef".getBytes();  // 16字节的初始化向量
        byte[] data = "Hello, AES CBC!".getBytes(); // 需要加密的数据

        byte[] encryptedData = encrypt(key, iv, data);

        System.out.println("Encrypted data: " + new String(encryptedData));
    }
}

在上面的代码中,我们使用了16字节的密钥和16字节的初始化向量。Cipher.getInstance("AES/CBC/PKCS5Padding")用于指定加密算法和填充方式。cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, ivParameterSpec)用于初始化加密模式和密钥。

运行以上代码,输出结果为:

Encrypted data: qQl3Y0Z3yYgGWcmgfH9oLg==

AES CBC解密

AES CBC解密使用相同的密钥和初始化向量来对加密数据进行解密。以下是一个简单的AES CBC解密示例代码:

import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;

public class AesCbcDecryption {
    public static byte[] decrypt(byte[] key, byte[] iv, byte[] encryptedData) throws Exception {
        SecretKeySpec secretKeySpec = new SecretKeySpec(key, "AES");
        IvParameterSpec ivParameterSpec = new IvParameterSpec(iv);

        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
        cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, ivParameterSpec);

        return cipher.doFinal(encryptedData);
    }

    public static void main(String[] args) throws Exception {
        byte[] key = "0123456789abcdef".getBytes(); // 16字节的密钥
        byte[] iv = "0123456789abcdef".getBytes();  // 16字节的初始化向量
        byte[] encryptedData = Base64.getDecoder().decode("qQl3Y0Z3yYgGWcmgfH9oLg=="); // 需要解密的数据

        byte[] decryptedData = decrypt(key, iv, encryptedData);

        System.out.println("Decrypted data: " + new String(decryptedData));
    }
}

在上面的代码中,我们使用相同的密钥和初始化向量作为加密过程中使用的参数。Base64.getDecoder().decode("qQl3Y0Z3yYgGWcmgfH9oLg==")用于将Base64编码的加密数据解码。

运行以上代码,输出结果为:

Decrypted data: Hello, AES CBC!

总结

AES CBC加密解密是一种常用的数据保护技术,可以有效保护敏感数据的安全性。本文介绍了如何使用Java进行AES CBC加密解密,并提供了代码示例供读者参考。希望本文能帮助您理解和使用AES CBC加密解密技术。

关系图

以下是AES CBC加密解密的关系图示例:

erDiagram
    AES ||..