BouncyCastle错误:无法识别基于ECDSA的签名者中的密钥类型

时间:2011-05-12 13:16:21

标签: java rsa bouncycastle elliptic-curve

我一直在使用BouncyCastle的加密库和RSA的加密库进行一些简单的测试。我正在做的是生成私有/公钥对,如下所示:

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的签名者中的密钥类型

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

2 个答案:

答案 0 :(得分:4)

我按照以下步骤解决了同样的问题:

1)创建静态提供者:

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

2)生成keyPair:

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

3)如果你想用钥匙签名:

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

它对我有用,并且希望也适合你。

答案 1 :(得分:3)

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