GCMParameterSpec 抛出 InvalidAlgorithmParameterException:未知参数类型

Ric*_*rdo 4 java encryption android cryptography aes-gcm

我正在做 android 数据加密以保存在 SharedPreferences 中。GCMParameterSpec 是在我用于AES/GCM/NoPadding加密的API 19 中的 Android 中引入的。这就是我实施它的方式:

Cipher c = Cipher.getInstance("AES/GCM/NoPadding");
c.init(Cipher.ENCRYPT_MODE, getSecretKey(context),new GCMParameterSpec(128,Base64.decode(myGeneratedIV, Base64.DEFAULT)));
Run Code Online (Sandbox Code Playgroud)

我的问题是,在 Android 4.4.2 (API 19) 中,我收到了提到的错误,但从 API 21 开始就可以工作了。

关于异常,来自 Android 文档:

如果给定的算法参数不适合此密码,或者此密码需要算法参数并且 params 为空,或者给定的算法参数暗示加密强度将超过法定限制(根据配置的管辖策略文件确定)。

我的问题是:这种行为有具体的原因吗?为什么initCipher的方法不能识别参数?

我什至尝试在不提供特定 IV 的情况下进行加密:

c.init(Cipher.ENCRYPT_MODE, getSecretKey(context));
Run Code Online (Sandbox Code Playgroud)

一旦我尝试以相同的方式解密:

c.init(Cipher.DECRYPT_MODE, getSecretKey(context));
Run Code Online (Sandbox Code Playgroud)

它抛出相同的异常(InvalidAlgorithmParameterException)说GCMParameterSpec需要解密。

我尝试GCMParameterSpec只给解密,我得到了未知的参数类型异常。

任何帮助表示赞赏

Maa*_*wes 5

可能是CipherSpiAndroid 中提供程序中的实现可能尚不支持GCMParameterSpec。定义 API 与在底层加密提供程序中为其提供支持不同。

相反,您也可以使用IvParameterSpec为其他模式提供的标准。只需将 (12) IV/nonce 字节GCMParamterSpec直接用作您的 IV。

由于您拥有标准标签大小,因此您的实现应该不会出现问题。


如果标签大小不同,则解决方案会变得更加复杂,因为验证将仅使用结果标签的最左边的字节。不幸的是,标记生成和验证隐藏在类的 API 设计中Cipher