【问题标题】:AES-GCM with arbitrary tag length具有任意标签长度的 AES-GCM
【发布时间】: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


【解决方案1】:

Bouncy Castle 库的创建是为了支持软件中的许多算法,但需要注意的是,如果你真的想这样做,它会让你自爆。

我可以毫无问题地运行上面的代码,标签大小为 32:

Security.addProvider(new BouncyCastleProvider());

SecretKeySpec secretKey = new SecretKeySpec(new byte[16], "AES");

final Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding", "BC");
GCMParameterSpec parameterSpec = new GCMParameterSpec(32, new byte[16]);
cipher.init(Cipher.ENCRYPT_MODE, secretKey, parameterSpec);
cipher.update("Maarten did it".getBytes(StandardCharsets.UTF_8));
byte[] ct = cipher.doFinal();     

请注意,可以看到错误,例如here。如您所见,这是 provider 中 AES/GCM 的内部实现,而不是例如Cipher。您可能已经通过查看完整的堆栈跟踪发现了这一点...

【讨论】:

  • shoot yourself in the foot :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-05-12
  • 1970-01-01
  • 2013-07-17
  • 2020-05-29
  • 2021-04-06
  • 1970-01-01
  • 2010-10-03
相关资源
最近更新 更多