具有任意标签长度的 AES-GCM

fac*_*or2 5 java encryption aes aes-gcm

对于算法测试向量评估,我尝试在 GCM 模式下执行 AES,以使用任意标签长度值(例如 32 位)进行加密和解密。

当我尝试使用任意标签长度初始化密码时,如下所示:

final Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding");
GCMParameterSpec parameterSpec = new GCMParameterSpec(tagLen, iv);
cipher.init(Cipher.ENCRYPT_MODE, secretKey, parameterSpec);
Run Code Online (Sandbox Code Playgroud)

我遇到了这个错误:

java.security.InvalidAlgorithmParameterException: Unsupported TLen value; must be one of {128, 120, 112, 104, 96}
Run Code Online (Sandbox Code Playgroud)

通常,这将是一件好事,因为您不希望标签长度为 32。但是,出于我的目的,我确实需要此标签长度。

有没有办法可以覆盖这些限制以允许任意标签长度?

Maa*_*wes 3

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();     

Run Code Online (Sandbox Code Playgroud)

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