2

我进行“签名”操作并具有以下代码:

 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 进行初始化时不使用特定的提供程序(我不这样做)并且不将密钥转换为 RSAPrivateKey(我不这样做!)。

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

4

1 回答 1

0

我的代码遇到了同样的问题,感谢这个论坛,我发现以下行是导致它的原因:

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

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


你提到

我需要它用于其他目的,因此我在静态块中有以下内容

解决这个问题并仍然能够使用 SpongyCastle 功能的方法是仅在需要它的方法中使用 SpongyCastle 作为提供者

于 2020-07-29T17:07:12.310 回答