AES(Advanced Encryption Standard)是目前广泛使用的一种对称加密算法。它的加密速度快、强度高,被广泛应用于文件加密、传输加密等领域。本文将带你一步一步了解 Java 中的 AES 加密,包括 分组模式(Block Mode) 和 填充方式(Padding) 的概念,并结合代码示例说明其使用。
今天是1024,用123456789 还有哪些方式可以组成1024呢?
参考https://doubao.blog.csdn.net/article/details/142977064
AES 是对称加密算法,这意味着加密和解密使用同一个密钥。AES 支持三种密钥长度:128 位、192 位 和 256 位。AES 是基于 分组加密(Block Cipher) 的算法,每次加密固定长度的明文块(通常是 128 位,即 16 字节),如果明文不足 16 字节,需要进行填充(Padding)。
AES 是分组加密算法,每次只能加密一个固定长度的块,为了加密长度不定的明文,需要采用不同的分组模式。常见的分组模式包括:
其中,CBC 模式和CTR 模式比较常用,因为它们提供了更好的安全性。
AES 的分组长度是固定的 128 位(16 字节),但实际明文长度往往不是 16 字节的倍数,因此需要填充。常见的填充方式有:
接下来,我们通过 Java 代码来实现 AES 加密,结合不同的 分组模式 和 填充方式 进行示例。
ECB 模式是最简单的 AES 加密方式,代码如下:
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import java.util.Base64;
public class AesEcbExample {
public static void main(String[] args) throws Exception {
// 生成 AES 密钥
KeyGenerator keyGen = KeyGenerator.getInstance("AES");
keyGen.init(128); // 选择 AES-128
SecretKey secretKey = keyGen.generateKey();
// 初始化加密器,指定 AES/ECB/PKCS5Padding
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, secretKey);
// 加密
String plaintext = "Hello AES in ECB mode";
byte[] encrypted = cipher.doFinal(plaintext.getBytes());
// 输出密文(Base64 编码)
System.out.println("加密后的密文:" + Base64.getEncoder().encodeToString(encrypted));
}
}
在 ECB 模式下,相同的明文块会产生相同的密文块,容易被攻击,因此不推荐使用。
CBC 模式相对更安全,它使用了初始向量(IV)来确保加密结果的随机性。以下是 CBC 模式的示例:
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.IvParameterSpec;
import java.util.Base64;
public class AesCbcExample {
public static void main(String[] args) throws Exception {
// 生成 AES 密钥
KeyGenerator keyGen = KeyGenerator.getInstance("AES");
keyGen.init(128);
SecretKey secretKey = keyGen.generateKey();
// 随机生成 IV
byte[] iv = new byte[16];
IvParameterSpec ivSpec = new IvParameterSpec(iv);
// 初始化加密器,指定 AES/CBC/PKCS5Padding
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, secretKey, ivSpec);
// 加密
String plaintext = "Hello AES in CBC mode";
byte[] encrypted = cipher.doFinal(plaintext.getBytes());
// 输出密文(Base64 编码)
System.out.println("加密后的密文:" + Base64.getEncoder().encodeToString(encrypted));
}
}
CBC 模式需要初始向量(IV),它确保每次加密同样的明文时,生成不同的密文块,从而提升了安全性。
CTR 模式是一种流模式加密,它将计数器作为输入,加密后生成密钥流,再与明文异或得到密文。以下是示例:
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.IvParameterSpec;
import java.util.Base64;
public class AesCtrExample {
public static void main(String[] args) throws Exception {
// 生成 AES 密钥
KeyGenerator keyGen = KeyGenerator.getInstance("AES");
keyGen.init(128);
SecretKey secretKey = keyGen.generateKey();
// 随机生成计数器 (IV)
byte[] iv = new byte[16];
IvParameterSpec ivSpec = new IvParameterSpec(iv);
// 初始化加密器,指定 AES/CTR/NoPadding
Cipher cipher = Cipher.getInstance("AES/CTR/NoPadding");
cipher.init(Cipher.ENCRYPT_MODE, secretKey, ivSpec);
// 加密
String plaintext = "Hello AES in CTR mode";
byte[] encrypted = cipher.doFinal(plaintext.getBytes());
// 输出密文(Base64 编码)
System.out.println("加密后的密文:" + Base64.getEncoder().encodeToString(encrypted));
}
}
CTR 模式的优点在于,它不需要填充,因为每个明文字节都直接与伪随机密钥流异或。
在 Java 中,使用 AES 加密时,需要考虑以下几点:
使用 AES 加密时,一定要谨慎选择分组模式和填充方式,确保安全性和兼容性。希望通过本文,你对 Java 中的 AES 加密有了更深入的了解。