我一直在使用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生成的密钥呢?
答案 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要求用于其签名实施的私钥必须是其自己的私钥之一。我不知道为什么你会在任何情况下为各种作品选择不同的提供者。