You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:14:48