当前位置: 首页 > 知识库问答 >
问题:

错误的RSA PrivateKey密钥存储库

葛修真
2023-03-14

我的应用程序在打开时会生成一个keypair。我可以使用PublicKey加密文本,但当我尝试使用PrivateKey解密时,它会抛出InvalidKeyException

某些log.v调试:

(...) V/Aliases: The public key created is [android.security.keystore.AndroidKeyStoreRSAPublicKey@1840131a]
(...) V/Aliases: The private key created is [android.security.keystore.AndroidKeyStoreRSAPrivateKey@37ad0430]
(...) V/Aliases: The public key used is [android.security.keystore.AndroidKeyStoreRSAPublicKey@1840131a]
(...) V/Aliases: The private key used is [android.security.keystore.AndroidKeyStoreRSAPrivateKey@37ad0430]
(...) V/Aliases: The private key [android.security.keystore.AndroidKeyStoreRSAPrivateKey@37ad0430] is incorrect

KeyPair生成:

try {
    //Load KeyStore  
    keystore = KeyStore.getInstance("AndroidKeyStore");
    keystore.load(null);

} catch (KeyStoreException | IOException | NoSuchAlgorithmException | CertificateException e) {
        e.printStackTrace();
    }

    //KeyPair generation
    KeyPairGenerator kpg = null;
    try {
        kpg = KeyPairGenerator.getInstance("RSA", "AndroidKeyStore");
        kpg.initialize(new KeyGenParameterSpec.Builder("Test",KeyProperties.PURPOSE_DECRYPT | KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_SIGN)
                .setDigests(KeyProperties.DIGEST_SHA256, KeyProperties.DIGEST_SHA512)
                .build());
        kp = kpg.generateKeyPair();
        Log.v("Aliases", "The public key created is [" + kp.getPublic() + "]");
        Log.v("Aliases", "The private key created is [" + kp.getPrivate()+ "]");

    } catch (NoSuchAlgorithmException | NoSuchProviderException | InvalidAlgorithmParameterException e) {
        e.printStackTrace();
    }

加密函数:

//Removed try/catch
KeyStore.PrivateKeyEntry privateKeyEntry = (KeyStore.PrivateKeyEntry) keystore.getEntry("Test", null);
PublicKey publicKey = privateKeyEntry.getCertificate().getPublicKey();

Log.v("Aliases", "The public key used is [" + publicKey + "]");

Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
[] bytes = cipher.doFinal(edittext.getText().toString().getBytes());
edittext.setText(Base64.encodeToString(bytes, Base64.DEFAULT));

解密函数:

//Removed try/catch
KeyStore.PrivateKeyEntry privateKeyEntry = (KeyStore.PrivateKeyEntry) keystore.getEntry("Test", null);
PrivateKey privateKey = privateKeyEntry.getPrivateKey();

Log.v("Aliases", "The private key used is [" + privateKey + "]");

Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.DECRYPT_MODE, privateKey);
String decrypted = new String(cipher.doFinal(Base64.decode(edittext.getText().toString(), Base64.DEFAULT)));
edittext.setText(decrypted);

//Removed the "try" part. This gets executed when cipher.init returns InvalidKeyException
catch (InvalidKeyException e) {
            KeyStore.PrivateKeyEntry privateKeyEntry = null;
            privateKeyEntry = (KeyStore.PrivateKeyEntry) keystore.getEntry("Test", null);
            PrivateKey privateKey = privateKeyEntry.getPrivateKey();
            Log.v("Aliases", "The private key [" + privateKey + "] is incorrect");
            e.printStackTrace();
}

共有1个答案

秦炜
2023-03-14

不要这样做:

Cipher cipher = Cipher.getInstance("RSA");

始终指定完整的“算法/模式/填充”规范。例如,

Cipher cipher = Cipher.getInstance("RSA/ECB/OAEPwithSHA-256andMGF1Padding");

现在您还需要告诉AndroidKeyStore您允许的密钥加密页是什么。因此,在KeyGenParameterSpec.Builder(...)的调用链中添加setEncryptionPaddings(keyProperties.Encryption_Padding_RSA_OAEP)调用,即。

kpg.initialize(new KeyGenParameterSpec.Builder("Test",
                KeyProperties.PURPOSE_DECRYPT | KeyProperties.PURPOSE_ENCRYPT |
                        KeyProperties.PURPOSE_SIGN)
                .setDigests(KeyProperties.DIGEST_SHA256, KeyProperties.DIGEST_SHA512)
                .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_RSA_OAEP)
                .build());
 类似资料:
  • 我必须连接到一个基于REST的WebService。 (https://someurl.com/api/lookup/jobfunction/lang/en) 在IE或chrome浏览器中,当我尝试访问这个URL时,我会得到一个证书,我必须信任它并接受它才能继续,然后我必须输入用户名和密码,然后我会得到JSON响应。 同样的事情,我必须为一个android应用程序编程。 > 尝试使用自定义Easy

  • 我正在使用ionic开发一个android应用程序。我用一个新的密钥库错误地给我的应用程序签名。当我将应用程序上传到PlayStore时发现证书不相等时,我使用了与PlayStore中所需证书相同的备份keystore文件。 现在,如果我想用命令对我的。apk进行jarsign 我得到以下错误 我谷歌了很多,但我不确定是否有任何解决方案可以帮助我。我必须使用我的旧证书,不能使用一个新的,因为我不能

  • 当我尝试使用较低版本的android登录我的应用程序时,会发生此错误。所有安装了android 4.3及以上版本的手机/模拟器都能够无误登录,其中4.1.1版的手机和平板电脑会出现以下错误。我们认为这是因为android版本较低,正在寻找任何解决方案。 我目前试图降低我的版本的充气城堡到146像在这个链接 “密钥存储版本错误”错误。如何创建版本=1的密钥库证书? 我已经被困在这个问题上一天了,所以

  • 我在使用SSL时遇到了困难,因为我得到了以下与我的密钥存储相关的错误(使用keytool per:http://developer.android.com/tools/publishing/app-signing.html自创建和自签名): 08-14 20:55:23.044:W/System.err(5430):java.io.ioException:密钥存储的版本错误。08-14 20:55

  • 我正在intellij和Gradle下开发android应用程序。并使用以下方式生成密钥库文件: 然后使用build.gradle中的密钥库文件: 任务“:MyExample:PackageRelease”执行失败。 无法从密钥存储区读取密钥

  • 对于PGP想要使用的签名和加密密钥,我是否可以使用2个JCE、RSA或DSA keypairs?把它们保存在密钥库中,当我想使用这些密钥时,只需按需重建PGP基础结构?