来进行选择,通常推荐使用CBC 或 CFB 模式,而不是 ECB 模式。3、Java 实现完整示例
时间: 2024-09-11 18:05:06 浏览: 38
ECB (Electronic Codebook) 模式是一种常用的块加密模式,它将明文分成若干固定大小的块,然后对每个块独立地应用密钥进行加密。然而,ECB模式的问题在于它缺乏安全性,因为相同的输入块会得到相同的输出,这使得它易于分析和攻击。如果数据有规律性,比如连续的重复部分,通过比较明文和密文的变化,可以推断出加密的信息。
相比之下,CBC (Cipher Block Chaining) 和 CFB (Cipher Feedback) 模式更安全,它们利用前一块的密文作为下一块加密的输入,增加了信息的混淆性和不可预测性。CBC模式常用于需要防碰撞和保密性的场景,而CFB模式则适合流式加密,并且可以根据需要调整输出块的长度。
以下是Java中使用AES(Advanced Encryption Standard)算法,基于CBC模式的一个简单加密示例:
```java
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import java.security.Key;
import java.util.Base64;
public class AES_CBCExample {
private static final String ALGORITHM = "AES";
private static final byte[] keyValue = "YourSecretKey123".getBytes(); // 使用密钥字符串转换成字节数组
public static String encrypt(String plainText, String iv) throws Exception {
Key key = generateKey(keyValue);
Cipher cipher = Cipher.getInstance(ALGORITHM + "/CBC/PKCS5Padding");
IvParameterSpec ivSpec = new IvParameterSpec(Base64.getDecoder().decode(iv));
cipher.init(Cipher.ENCRYPT_MODE, key, ivSpec);
byte[] encryptedBytes = cipher.doFinal(plainText.getBytes());
return Base64.getEncoder().encodeToString(encryptedBytes);
}
public static Key generateKey(byte[] key) throws Exception {
KeyGenerator keyGen = KeyGenerator.getInstance(ALGORITHM);
keyGen.init(128); // 128位的AES
return keyGen.generateKey();
}
public static void main(String[] args) throws Exception {
String input = "Hello, World!";
String iv = "AQIDBAU="; // 初始化向量,也可以从外部获取
String encrypted = encrypt(input, iv);
System.out.println("Encrypted text: " + encrypted);
}
}
```
在这个例子中,`encrypt`方法首先生成一个AES密钥,然后初始化一个CBC模式的Cipher实例,对输入文本进行加密。`main`方法展示了一个简单的使用流程。
阅读全文