让 AES-GCM 也适用于旧的 android 版本

Get AES-GCM to work also on older android versions

我正在 android 应用程序中以 GCM 操作模式实施 AES 加密算法。

我的 IDE (Intellij Idea) 告诉我要使用 javax.crypto.spec.GCMParameterSpec 条件 android.os.Build.VERSION.SDK_INT> = android.os.Build.VERSION_CODES.KITKAT 是必需的。

我在条件未验证时尝试使用 javax.crypto.spec.GCMParameterSpec,我下载了 source file 并将其包含在我的项目中,但加密操作无法正常工作(解密数据与原始数据不匹配或 java.security.InvalidAlgorithmParameterException: IV must be specified in GCM mode).

关于我如何支持以前版本的 Android KITKAT,您有什么建议吗?

提前致谢。

基于Java6的Android的初始版本没有给你GCMParameterSpec,但他们会用IvParameterSpec代替。除了(通常是 12 字节的)IV,GCMParameterSpec 会给你两个额外的操作:支持额外的数据和标签大小。

现在标签大小不是什么大问题:首先,通常使用完整的 128 位/16 字节。此外,您可以从密文末尾删除这些字节,直到达到所需的标签大小,例如删除 4 个字节/32 位以获得 96 位的标记大小。

附加数据是个问题,据我所知,没有办法指定这些数据,至少如果您需要 Cipher 实例,则无法指定。您当然可以使用 GCMBlockCipher 代替,但您不会使用 Cipher 和平台提供的任何可能的加速(因为 Bouncy 只是软件)。

是的,如前所述,完全可以自己为 Android 实施 GCM 模式,因为您不需要签署任何提供商。当然,您必须使用不同的 GCMParameterSpec 实现,最好只使用旧平台的提供程序,因此似乎需要进行一些运行时切换。