2011-05-12 24 views
2

我一直在用BouncyCastle的加密库和RSA的加密库进行一些简单的测试。什么我做的是生成公钥​​/私钥对,像这样:BouncyCastle错误:无法识别基于ECDSA的签名者的密钥类型

KeyPairGenerator kpg = KeyPairGenerator.getInstance("EC", "JsafeJCE"); 
kpg.initialize(new ECGenParameterSpec("secp384r1")); 
KeyPair kp = kpg.genKeyPair(); 
PrivateKey priv = kp.getPrivate(); 
PublicKey pub = kp.getPublic(); 

然后我产生像这样

Signature sig = Signature.getInstance("SHA384/ECDSA","BC"); 

签名,我尝试登录私钥:

sig.initSign(priv); 

所有这些都给我带来了错误:

java.security.InvalidKeyException:无法识别ECDSA中的密钥类型based签署者

当我BC和JsafeJCE,我没有得到任何错误,一切都很好。如果两个提供者都是BC,也可以工作那么为什么我不能用BC库签署JsafeJCE生成的密钥?

回答

2

Bouncycastle要求用于其签名实现的私钥必须是其自己的私钥之一。我不知道为什么你会在任何情况下为不同的作品选择不同的供应商。

1)创建静态提供商:

private static BouncyCastleProvider bouncyCastleProvider; 
public static final BouncyCastleProvider BOUNCY_CASTLE_PROVIDER = new BouncyCastleProvider(); 
static { 
    bouncyCastleProvider = BOUNCY_CASTLE_PROVIDER; 
} 

2)生成密钥对:

KeyPairGenerator g = KeyPairGenerator.getInstance("ECDSA", bouncyCastleProvider); 
g.initialize(ecSpec, random); 
KeyPair keyPair = g.generateKeyPair(); 

3)如果你想

+0

当另一端的提供者不同时会发生什么?所以我正在使用使用JsafeJCE提供程序的现有应用程序。我在我的末端使用了BC。 BC能否正确验证一切? – Otra 2011-05-16 14:10:44

+0

是的,数据是使用独立于提供者的标准格式传输的。 – 2011-05-16 23:54:10

3

我按照下面的步骤来解决相同的问题用钥匙签名:

Signature signature = Signature.getInstance("SHA256withECDSA", bouncyCastleProvider); 
signature.initSign(privateKey); 
signature.update(signedData); 
signature.sign(); 

它为我工作,并希望为你工作。

相关问题