gpt4 book ai didi

java - (java.security.InvalidKeyException) 在 cipher.init(Cipher.DECRYPT_MODE, key) 出现预期错误时未设置 IV

转载 作者:行者123 更新时间:2023-11-29 07:33:08 26 4
gpt4 key购买 nike

SecretKey key = keyFactory.generateSecret(keySpec);
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, key);
byte[] ciphertext = cipher.doFinal(cleartext);

return bytes2String(ciphertext);

我得到 java.security.InvalidKeyException 即当 cipher.init(Cipher.DECRYPT_MODE, key) 出现预期错误时没有设置 IV。cleartext 是字符串的 base64 解码的字节数组结果。我在这里缺少什么?

最佳答案

我不是这方面的专家,但您指定的是 CBC mode这需要一个初始化 vector (IV),对于 AES 来说是一个 16 字节的参数。

private final static byte[] iv = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 };
private static final IvParameterSpec ivspec = new IvParameterSpec(iv);

然后在调用init()方法时提供加解密时的IV。

cipher.init(Cipher.ENCRYPT_MODE, key, ivspec);
cipher.init(Cipher.DECRYPT_MODE, secretKey, ivspec);

您永远不应该使用上述方法并让 Java 为您生成随机 IV 或提供 SecureRandom 实现。

使用随机 IV 的要点是确保相同的明文不会加密生成两次相同的密文。这是 IV 的唯一目的。

将 IV 存储在加密文本的开头,解密时您知道开头的 n 位数字是 IV。

当不提供 IV 时,它会默认生成一个随机 IV。 Source

If this cipher (including its underlying feedback or padding scheme) requires any random bytes (e.g., for parameter generation), it will get them using the SecureRandom implementation of the highest-priority installed provider as the source of randomness. (If none of the installed providers supply an implementation of SecureRandom, a system-provided source of randomness will be used.)

关于java - (java.security.InvalidKeyException) 在 cipher.init(Cipher.DECRYPT_MODE, key) 出现预期错误时未设置 IV,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39422786/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com