Android API-23(棉花糖)中未生成私钥

Android API-23(棉花糖)中未生成私钥,android,encryption,rsa,android-6.0-marshmallow,android-keystore,Android,Encryption,Rsa,Android 6.0 Marshmallow,Android Keystore,我一直在使用keystore生成RSA密钥/对,代码一直在为API级别18-22工作。 今天,当我在API-23上运行它时,我无法从密钥库检索私钥。 以下是我一直在使用的代码: KeyPairGeneratorSpec spec = new KeyPairGeneratorSpec.Builder(context) .setAlias(utility.getConfigValue(configuration, OuterKeys.KEYSTORE_

我一直在使用keystore生成RSA密钥/对,代码一直在为API级别18-22工作。 今天,当我在API-23上运行它时,我无法从密钥库检索私钥。 以下是我一直在使用的代码:

KeyPairGeneratorSpec spec = new KeyPairGeneratorSpec.Builder(context)
                        .setAlias(utility.getConfigValue(configuration, OuterKeys.KEYSTORE_NAME))
                        .setSubject(
                                new X500Principal("CN=Sample Name, O=Android Authority"))
                        .setSerialNumber(BigInteger.ONE).setStartDate(start.getTime())
                        .setEndDate(end.getTime()).build();
                KeyPairGenerator generator = null;
                generator = KeyPairGenerator.getInstance("RSA", "AndroidKeyStore");
                generator.initialize(spec);
                KeyPair keyPair = generator.generateKeyPair();
                PrivateKey privateKey = keyPair.getPrivate();
                PublicKey publicKey = keyPair.getPublic();

                byte[] publicKeyBytes = publicKey.getEncoded();
                String pubKeyStr = Base64.encodeToString(publicKeyBytes, Base64.NO_PADDING);
                byte[] privKeyBytes = privateKey.getEncoded();
                String privKeyStr = Base64.encodeToString(privKeyBytes, Base64.NO_PADDING);

                Log.d("^^^^^^^^^1",pubKeyStr);
                Log.d("^^^^^^^^^2",privKeyStr);
我对此进行了调试,发现生成的私钥为null。 然而,我可以在检索公钥字符串时打印它。
有人可以帮忙吗。

看起来您正在从Android密钥库检索PrivateKey实例。您也应该能够将这个PrivateKey实例与密码和签名原语一起使用


“不起作用”的是PrivateKey实例的getEncoded返回null。正如James K Polk所提到的,这是按预期进行的。getEncoded应该返回私钥的密钥材料(通常采用PKCS#8 DER编码格式),如果不支持密钥材料导出,则返回null。Android Keystore按设计不显示/导出私钥的密钥材料,因此getEncoded返回null。在较旧的Android平台版本上,它可能返回了一个空字节数组。

看起来您正在从Android密钥库检索PrivateKey实例。您也应该能够将这个PrivateKey实例与密码和签名原语一起使用


“不起作用”的是PrivateKey实例的getEncoded返回null。正如James K Polk所提到的,这是按预期进行的。getEncoded应该返回私钥的密钥材料(通常采用PKCS#8 DER编码格式),如果不支持密钥材料导出,则返回null。Android Keystore按设计不显示/导出私钥的密钥材料,因此getEncoded返回null。在较旧的Android平台版本上,它可能返回了一个空字节数组。

您的意思是将目标sdk版本更改为23,还是在Android 6.0设备上运行它?我在6.0设备上运行它。
PrivateKey.getEncoded()
允许返回null。看一下,这似乎是正确的行为。感谢您的输入。我认为空返回很好,我需要重新表述我的问题。尝试使用私钥对任何数据进行签名或解密时,我遇到无效密钥异常。我读了这个问题:stackoverflow.com/questions/324000689/。但是解决方案对我不起作用。你是说你将目标sdk版本更改为23,还是说你正在Android 6.0设备上运行它?我正在6.0设备上运行它。
PrivateKey.getEncoded()
允许返回null。看一下,这似乎是正确的行为。感谢您的输入。我认为空返回很好,我需要重新表述我的问题。尝试使用私钥对任何数据进行签名或解密时,我遇到无效密钥异常。我读了这个问题:stackoverflow.com/questions/324000689/。但是这个解决方案对我不起作用。谢谢你的意见。我认为空返回很好,我需要重新表述我的问题。尝试使用私钥对任何数据进行签名或解密时,我遇到无效密钥异常。我读到这个问题:。但是解决方案对我不起作用。请提供重现问题和完整堆栈跟踪的示例代码。不确定Stack Overflow的偏好,但最好将所有这些作为新问题发布,或编辑原始内容以包含新信息。因此,问题在于,在Marshmallow类型中,向RSAPrivateKey强制转换不起作用。对于这个问题,尽管你的答案很完美。谢谢你的意见。我认为空返回很好,我需要重新表述我的问题。尝试使用私钥对任何数据进行签名或解密时,我遇到无效密钥异常。我读到这个问题:。但是解决方案对我不起作用。请提供重现问题和完整堆栈跟踪的示例代码。不确定Stack Overflow的偏好,但最好将所有这些作为新问题发布,或编辑原始内容以包含新信息。因此,问题在于,在Marshmallow类型中,向RSAPrivateKey强制转换不起作用。对于这个问题,尽管你的答案很完美。谢谢