默认提供程序返回的缓冲区大小不正确

时间:2019-02-18 19:31:32

标签: java android encryption aes-gcm

在Android 9和API 28中,不再支持Bouncy Castle提供程序(“ BC”),尝试使用它会导致NoSuchAlgorithmException。根据Android上的the official blog post,解决此问题的方法是完全不指定提供程序。

但是,默认提供程序的行为似乎与Bouncy Castle提供程序不同-在DECRYPT_MODE中,getOuptputSize方法为同一参数返回不同的值。下面的代码显示,当要求加密缓冲区的输出大小为51时,BC提供程序返回35,而默认提供程序返回51:

Cipher aesGCMCipher = Cipher.getInstance("AES/GCM/NoPadding", "BC");
GCMParameterSpec gcmParameterSpec = new GCMParameterSpec(AES_KEY_SIZE_IN_BITS, new byte[12]);
aesGCMCipher.init(Cipher.DECRYPT_MODE, aesSecretKey, gcmParameterSpec);
LOG.i("(Decrypt) BC provider output size: " + aesGCMCipher.getOutputSize(51));

Cipher defaultAesGCMCipher = Cipher.getInstance("AES/GCM/NoPadding");
GCMParameterSpec defaultGcmParameterSpec = new GCMParameterSpec(AES_KEY_SIZE_IN_BITS, new byte[12]);
defaultAesGCMCipher.init(Cipher.DECRYPT_MODE, aesSecretKey, defaultGcmParameterSpec);
LOG.i("(Decrypt) Default provider output size: " + defaultAesGCMCipher.getOutputSize(51));

// Ouptput:
(Decrypt) BC provider output size: 35
(Decrypt) Default provider output size: 51

请注意,ENCRYPT_MODE中返回的值是相同的:

Cipher aesGCMCipher = Cipher.getInstance("AES/GCM/NoPadding", "BC");
GCMParameterSpec gcmParameterSpec = new GCMParameterSpec(AES_KEY_SIZE_IN_BITS, new byte[12]);
aesGCMCipher.init(Cipher.ENCRYPT_MODE, aesSecretKey, gcmParameterSpec);
LOG.i("(Encrypt) BC provider output size: " + aesGCMCipher.getOutputSize(35));

Cipher defaultAesGCMCipher = Cipher.getInstance("AES/GCM/NoPadding");
GCMParameterSpec defaultGcmParameterSpec = new GCMParameterSpec(AES_KEY_SIZE_IN_BITS, new byte[12]);
defaultAesGCMCipher.init(Cipher.ENCRYPT_MODE, aesSecretKey, defaultGcmParameterSpec);
LOG.i("(Encrypt) Default provider output size: " + defaultAesGCMCipher.getOutputSize(35));

// Output
(Encrypt) BC provider output size: 51
(Encrypt) Default provider output size: 51

确定输出缓冲区大小的代码是否不正确,是否需要重写?或者它是实现中的错误,需要解决方法? 现在,由于返回的值不正确,分配的缓冲区太大,这会导致消息损坏(消息附加附加字节)。对我来说,这似乎是一个错误,但我不愿意任意削减最后16个字节,因为如果该错误已修复,则代码将再次回归。

0 个答案:

没有答案