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只给解密,我得到了未知的参数类型异常。
任何帮助表示赞赏
可能是CipherSpiAndroid 中提供程序中的实现可能尚不支持GCMParameterSpec。定义 API 与在底层加密提供程序中为其提供支持不同。
相反,您也可以使用IvParameterSpec为其他模式提供的标准。只需将 (12) IV/nonce 字节GCMParamterSpec直接用作您的 IV。
由于您拥有标准标签大小,因此您的实现应该不会出现问题。
如果标签大小不同,则解决方案会变得更加复杂,因为验证将仅使用结果标签的最左边的字节。不幸的是,标记生成和验证隐藏在类的 API 设计中Cipher。