aes gcm

vaqhlq81  于 2021-08-20  发布在  Java
关注(0)|答案(1)|浏览(339)

此问题已从加密堆栈交换迁移,因为它可以在堆栈溢出时得到回答。昨天迁移了。
对于算法测试向量评估,我尝试在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。但是,出于我的目的,我确实需要这个标记长度。
是否有一种方法可以覆盖这些限制以允许任意标记长度?

rta7y2nd

rta7y2nd1#

BouncyCastle库是为了支持软件中的许多算法而创建的,其中有一条警告:如果你真的想,它会让你射中自己的脚。
我可以在标签大小为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();

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

相关问题