AES/CBC/PKCS5Padding加解密时IV如何随机生成
时间: 2023-08-11 12:04:20 浏览: 246
在AES/CBC/PKCS5Padding加解密过程中,初始化向量(IV)的随机生成非常重要,以增加密码的随机性和安全性。以下是一个示例代码,演示如何生成随机的IV:
```java
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.security.SecureRandom;
import java.util.Base64;
public class AESCBCEncryptDecrypt {
public static void main(String[] args) throws Exception {
String key = "0123456789abcdef"; // 密钥,16字节
// 生成随机的16字节IV
byte[] ivBytes = generateRandomIV();
String plaintext = "Hello, World!"; // 明文
byte[] keyBytes = key.getBytes();
byte[] plaintextBytes = plaintext.getBytes();
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
SecretKeySpec secretKeySpec = new SecretKeySpec(keyBytes, "AES");
IvParameterSpec ivParameterSpec = new IvParameterSpec(ivBytes);
cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, ivParameterSpec);
byte[] encryptedBytes = cipher.doFinal(plaintextBytes);
String encryptedText = Base64.getEncoder().encodeToString(encryptedBytes);
System.out.println("Encrypted text: " + encryptedText);
// 解密过程
cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, ivParameterSpec);
byte[] decryptedBytes = cipher.doFinal(Base64.getDecoder().decode(encryptedText));
String decryptedText = new String(decryptedBytes);
System.out.println("Decrypted text: " + decryptedText);
}
private static byte[] generateRandomIV() {
byte[] iv = new byte[16];
SecureRandom secureRandom = new SecureRandom();
secureRandom.nextBytes(iv);
return iv;
}
}
```
在这个示例代码中,我们使用了 `SecureRandom` 类来生成随机的16字节IV。通过调用 `secureRandom.nextBytes(iv)`,我们将随机生成的字节填充到 `iv` 数组中。
请注意,在加密和解密过程中,使用相同的随机生成的IV才能正确地解密密文。
重要提示:确保在加密和解密过程中都使用相同的随机生成的IV值,否则解密将失败或产生错误的结果。
阅读全文