gpt4 book ai didi

java - 在 Java 中为 AES 生成随机 IV

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:51:17 27 4
gpt4 key购买 nike

我正在 android 中为 PBE 实现 AES 加密引擎,我找到了两种实现 IV 创建的方法,我想知道哪种方法更好更安全地获取 IvParameterSpec:

方法#1:

SecureRandom randomSecureRandom = SecureRandom.getInstance("SHA1PRNG");
byte[] iv = new byte[cipher.getBlockSize()];
randomSecureRandom.nextBytes(iv);

IvParameterSpec ivParams = new IvParameterSpec(iv);

方法#2:

AlgorithmParameters params = cipher.getParameters();
byte[] iv2 = params.getParameterSpec(IvParameterSpec.class).getIV();

ivParams = new IvParameterSpec(iv2);

最佳答案

我会使用方法 #1,因为 Java API 为仅采用加密/解密模式和 key 的 Cipher.init() API 指定了以下内容:

If this cipher instance needs any algorithm parameters or random values that the specified key can not provide, the underlying implementation of this cipher is supposed to generate the required parameters (using its provider or random values).

(强调我的)。

So it is not clear what different providers will do when method 2 is chosen.查看 Android 源代码,似乎至少某些版本(包括版本 21?)将不会创建随机 IV - 随机 IV 创建似乎被注释掉了。

方法 1 也更透明,在我看来,它更容易看。


请注意,通常最好使用 new SecureRandom() 并让系统找出最佳的 RNG。 “SHA1PRNG” 未明确定义,可能因实现而异,并且已知存在实现弱点,尤其是在 Android 上。


所以最终结果应该是这样的:

SecureRandom randomSecureRandom = new SecureRandom();
byte[] iv = new byte[cipher.getBlockSize()];
randomSecureRandom.nextBytes(iv);
IvParameterSpec ivParams = new IvParameterSpec(iv);

请注意,GCM 模式最适合使用 12 字节 IV 而不是 16 字节 IV - AES 的 block 大小。

关于java - 在 Java 中为 AES 生成随机 IV,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29267435/

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