3

我一直在用 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,也可以使用。那么为什么我不能用 BC lib 对 JsafeJCE 生成的密钥进行签名呢?

4

2 回答 2

4

Bouncycastle 要求用于其签名实现的私钥必须是它自己的一个。我不知道为什么无论如何你会为不同的部分选择不同的供应商。

于 2011-05-14T21:23:10.187 回答
4

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

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)如果您想使用密钥签名:

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

它对我有用,希望对你也有用。

于 2016-04-28T14:57:21.340 回答