使用 JDK 1.8 的 AES-GCM 加密

AES-GCM Encryption with JDK 1.8

计划添加对以下 Enc 算法的支持:

到 JDK 1.8 基于实现,参考 javax.crypto.spec.GCMParameterSpecjavax.crypto.Cipher。在这里,我了解到 Cipher 需要 GCMParameterSpec 对象,因为它:

public final void init(int opmode, Key key, AlgorithmParameterSpec params)

现在想知道上面列出的用于创建 GCMParameterSpec 对象的所有算法的 (IV & tLen) 的值是多少。

对于上面列出的不同算法,这些值是否会有所不同(不,在我看来,唯一的变化是密钥大小)

并且请描述 GCMParameterSpec 的这两个属性(IV 和 tLen)的用途

来源here:

For the purposes of this specification, AES-GCM shall be used with a 96 bit Initialization Vector (IV) and a 128 bit Authentication Tag (T).

需要 IV 或随机数 (number-used-once) 以确保相同的消息不会加密为相同的值。对于在底层使用 CTR 模式的 GCM 模式,至关重要 IV 从不重复

如果您继续阅读,您会发现:

For the Galois/Counter Mode (GCM) used by this specification, the IV must not be reused for any key and should be random, but it need not be secret.

对于 Java 这意味着从 SecureRandom 实例中检索 12 个随机字节;建议仅使用 new SecureRandom() 获得它。


身份验证标签当然会验证密文,从而验证加密的消息。这将确保保持消息的真实性和完整性。对于 GCM,身份验证标签的大小很重要;最好保持在最大值。 128 位的大小,本规范确实如此。


密钥大小确实与 IV 和身份验证标记的大小完全分开。

如果不确定,请阅读标准