【发布时间】:2021-09-19 03:22:19
【问题描述】:
对于算法测试向量评估,我正在尝试在 GCM 模式下执行 AES,以使用任意标签长度值(例如 32 位)进行加密和解密。
当我尝试使用如下任意标签长度初始化我的密码时:
final Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding");
GCMParameterSpec parameterSpec = new GCMParameterSpec(tagLen, iv);
cipher.init(Cipher.ENCRYPT_MODE, secretKey, parameterSpec);
我遇到了这个错误:
java.security.InvalidAlgorithmParameterException: Unsupported TLen value; must be one of {128, 120, 112, 104, 96}
通常,这将是一件好事,因为您不希望标签长度为 32。但是,出于我的目的,我确实需要这个标签长度。
有没有办法可以覆盖这些限制以允许任意标签长度?
【问题讨论】:
-
在 GCM 中使用短标签长度通常是个坏主意;除了某人能够以 $2^{-32}$ 的概率生成伪造的明显弱点之外,如果有人要找到用于加密消息的 nonce 的伪造,他们可以使用它来生成其他伪造。这是特定于 GCM(以及类似的算法,例如(我相信)Poly1305)。您是否有理由不能使用(比如)没有此警告的 HMAC 或 CMAC?
-
100% 同意,这就是为什么我把它放在问题中:“通常,这将是一件好事,因为您不希望标签长度为 32。但是,出于我的目的,我确实需要这个标签长度。”。由于这些是测试向量,因此我需要确保使用测试正确后端的库,在本例中为 JCE。我需要专门测试这个库的 AESGCM 算法。
-
有点技术性,但是,这是一个骗局; What are the constraints on using GCM with a tag size of 96 and 128 bits?。消息大小和消息数量很重要。您需要编辑该库或找到一个以实现 32 位标签长度(这里是题外话)。
标签: java encryption aes aes-gcm