我正在编写一个应用程序,它有很多安全限制:它需要安全加密存储文件,并且必须能够解密它们。此外,操作员需要能够在没有应用程序的情况下解密文件。
为了存档,我KeyPair
在我的 PC 上生成了一个,将公共部分放在我的应用程序中,在应用程序中生成一个AES
SecretKey
密钥,用我的公钥加密并保存它(用于操作员目的),然后将未加密的密钥放在AndroidKeyStore
.
要加密消息,我收到SecretKey
from KeyStore
,加密我的消息,获取IV
I used 和 encryptedSecretKey,然后按照定义的顺序将它们写入字节数组 (iv->encryptedSecretKey->encryptedMessage)。
要解密,我反向尝试相同的方法:获取字节数组,读取 iv 和 encryptedSecretKey,并将其余的 (encryptedMessage) 传递给我的密码进行解密。问题是,这cipher.doFinal(encryptedMessage)
是抛出 javax.crypto.AEADBadTagException
由android.security.KeyStoreException: Signature/MAC verification failed
.
我已经检查过加密的消息和我想要解密的消息是完全一样的。我不知道我做错了什么。
顺便说一下,minSdkVersion 是 25,所以比 Marshmallow 高
更新:
修复Cipher.DECRYPT_MODE
了ENCRYPT_MODE
将 SecretKey thx 保存到 James K Polk 的评论
如果我从BlockMode
GCM
BlockMode切换CBC
(并更改GCMParameterSpec
为IvParamterSpec
但失去 GCM 模式的验证,它会起作用。
弑天下
相关分类