提供的密钥(android.security.keystore.AndroidKeyStoreRSAPrivateKey)不是RSAPrivateKey实例

时间:2017-05-29 15:27:01

标签: android security rsa sign spongycastle

我做"签署"操作并具有以下代码:

 KeyStore.PrivateKeyEntry privateKeyEntry = 

(KeyStore.PrivateKeyEntry)keyStore.getEntry(keyAlias, null);
 PrivateKey privateKey = privateKeyEntry.getPrivateKey();

 signature = Signature.getInstance("NONEwithRSA");
 signature.initSign(privateKey);
 signature.update(data);

执行上述操作后,我收到以下异常:

05-29 17:33:36.106 W/System.err( 4478): java.security.InvalidKeyException: Supplied key (android.security.keystore.AndroidKeyStoreRSAPrivateKey) is not a RSAPrivateKey instance
05-29 17:33:36.107 W/System.err( 4478):     at org.spongycastle.jcajce.provider.asymmetric.rsa.DigestSignatureSpi.engineInitSign(DigestSignatureSpi.java:92)
05-29 17:33:36.107 W/System.err( 4478):     at java.security.Signature$Delegate.init(Signature.java:1208)
05-29 17:33:36.107 W/System.err( 4478):     at java.security.Signature$Delegate.chooseProvider(Signature.java:1167)
05-29 17:33:36.107 W/System.err( 4478):     at java.security.Signature$Delegate.engineInitSign(Signature.java:1232)
05-29 17:33:36.107 W/System.err( 4478):     at java.security.Signature.initSign(Signature.java:607)
05-29 17:33:36.107 W/System.err( 4478):     at com.example.TestClass.sign(TestClass.java:289)

我也在同一个类中使用Spongy Castle库,因为我需要它用于其他目的,因此我在静态块中有以下内容:

Security.insertProviderAt(new org.spongycastle.jce.provider.BouncyCastleProvider(), 1);

这是什么问题?我已经阅读了StackOverflow上类似性质的所有线程,并且解决方案总是在Cipher上执行init时不使用特定的提供程序(我没有)并且不将密钥转换为RSAPrivateKey(我不要!)。

是否与Spongy注册为第一提供商有关?我没有任何想法。请分享

1 个答案:

答案 0 :(得分:0)

我的代码也遇到了同样的问题,多亏了this forum,我发现导致这一行的原因如下:

Security.insertProviderAt(new org.spongycastle.jce.provider.BouncyCastleProvider(), 1);

在获取私钥的同时将提供程序设置为SpongyCastle会覆盖Java的获取私钥的默认方式,这似乎会导致异常。


您提到

我将其用于其他目的,因此,我在 静态块

要解决此问题并仍然可以使用SpongyCastle的功能,请使用only use SpongyCastle as a provider in the methods that require it