是的,至少是针对Oracle提供的实施。它使用默认SecureRandom
实现单独生成。由于它的大小为12个字节(GCM的默认值),因此您具有96位的随机性。计数器重复的机会很小。您可以在Oracle JDK所基于的OpenJDK(GPL版)中查找源。
但是,我仍然建议您生成自己的12个随机字节,因为其他提供程序的行为可能有所不同。
这很有可能是因为它是GCM的默认值,但其他长度对于GCM 也 有效。但是,对于12字节以外的任何其他大小,该算法将不得不执行其他计算。由于弱点,强烈建议将其保留为12字节/ 96位,并且API可能会限制您选择IV大小 。
不可以,它的字节大小可以从64位到128位以8位为增量的任意大小。如果较小,则仅由身份验证标签的最左侧字节组成。您可以将标签的另一个大小GCMParameterSpec
用作init
呼叫的第三个参数。
请注意,GCM的强度在很大程度上取决于标签的大小。我建议将其保留为128位。最少应包含96位, 特别是 如果您要生成大量密文时。
往上看。对于Oracle提供程序,情况就是如此。使用GCMParameterSpec
来确保这一点。
几乎没有限制 ,是的。经过约2 ^ 48次加密后,我将开始担心。通常,您应该 设计 密钥更改。
请参阅问题5的答案
不,完全没有帮助。GCM在下面使用CTR模式,因此只需使用密钥流进行加密即可。它 不会 充当IV。如果您需要几乎无数个密文(高于2 ^ 48!),那么我建议您使用该随机数和密钥作为密钥派生函数或KDF。HKDF目前是最好的,但您可能需要使用Bouncy Castle或自己实施。