Android RSA解密报错:Keystore操作失败问题求助
RSA解密时抛出
InvalidKeyException: Keystore operation failed的排查与修复 从你提供的异常栈和代码来看,问题的核心出在Android M+版本下生成RSA密钥时的参数配置错误,导致生成的私钥没有权限执行解密操作。以下是具体的分析和修复方案:
核心问题:密钥生成时的Padding配置不匹配
在Android 6.0(API 23)及以上的KeyGenParameterSpec配置中,你错误地使用了签名用途的Padding,而非加密解密用途的Padding:
.setSignaturePaddings(KeyProperties.SIGNATURE_PADDING_RSA_PKCS1)
SIGNATURE_PADDING_RSA_PKCS1是用于RSA签名/验签操作的,而你的加密解密使用的是RSA/ECB/PKCS1Padding,需要对应使用加密用途的Padding。这种不匹配会导致AndroidKeyStore标记该密钥无法用于解密操作,从而抛出Keystore operation failed异常。
修复步骤
1. 修正密钥生成的Padding配置
将M+版本下的setSignaturePaddings替换为setEncryptionPaddings,并指定对应的加密Padding:
spec = new KeyGenParameterSpec.Builder(BuildConfig.APPLICATION_ID,KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT) .setCertificateSubject(new X500Principal("CN=Sample Name, O=Android Authority")) .setDigests(KeyProperties.DIGEST_SHA256) // 替换为加密解密用的Padding .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_RSA_PKCS1) .setCertificateSerialNumber(BigInteger.valueOf(1337)) .setCertificateNotBefore(start.getTime()) .setCertificateNotAfter(end.getTime()) .setRandomizedEncryptionRequired(false) .build();
2. 删除旧的错误密钥并重新生成
由于之前生成的密钥是基于错误的Padding配置创建的,无法直接用于解密,必须删除旧密钥后重新生成:
可以添加一个辅助方法来删除旧密钥:
private static void deleteInvalidKey(Context context) { try { KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore"); keyStore.load(null); String keyAlias = BuildConfig.APPLICATION_ID; if (keyStore.containsAlias(keyAlias)) { keyStore.deleteEntry(keyAlias); Log.d(TAG, "Old invalid key deleted successfully"); } } catch (Exception e) { Log.e(TAG, "Failed to delete old key", e); } }
在调用createKey()之前先执行这个方法,或者直接卸载重装应用(AndroidKeyStore中的密钥会随应用卸载被清除)。
3. 验证其他配置的一致性
- 确认你的
getCipher()方法返回的RSA/ECB/PKCS1Padding与密钥配置的ENCRYPTION_PADDING_RSA_PKCS1完全匹配,这部分你的代码是正确的。 - 确认密钥的用途
PURPOSE_ENCRYPT | PURPOSE_DECRYPT已经正确设置,这部分你的代码也没问题。
额外注意事项
- 如果你有之前用错误密钥加密的文本,这些文本无法用新生成的密钥解密,因为密钥对已经改变。
- AndroidKeyStore的密钥与应用的签名绑定,确保测试和发布环境使用同一签名,否则会出现密钥无法访问的问题。
内容的提问来源于stack exchange,提问作者benjaminbutton
相关产品推荐
相关产品推荐

