我做"签署"操作并具有以下代码:
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注册为第一提供商有关?我没有任何想法。请分享
答案 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。