使AES-GCM也可以在较旧的android版本上工作

问题描述

我正在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的早期版本,您有什么建议吗?

谢谢。

解决方法

基于Java 6的Android初始版本没有给您GCMParameterSpec,但是他们会使用IvParameterSpec。除了(通常为12个字节)IV外,GCMParameterSpec还为您提供了两个附加操作:对附加数据的支持和标签大小。

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

据我所知,附加数据是一个问题,据我所知,没有办法指定这些数据,至少在您需要一个Cipher实例的情况下没有。您当然可以改为使用GCMBlockCipher,但是您将不使用Cipher和平台提供的任何可能的加速功能(因为Bouncy仅是软件)。

是的,正如所指出的,完全可以自己为Android实现GCM模式,因为您无需签署任何提供商。当然,您必须使用不同的GCMParameterSpec实现,并且仅对较旧的平台使用提供程序是个好主意,因此似乎需要进行某些运行时切换。