3

私は、BouncyCastle の crypto ライブラリと RSA の crypto ライブラリを使っていくつかの簡単なテストを行ってきました。私がやっていることは、次のような秘密鍵と公開鍵のペアを生成することです:

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 の場合にも機能します。JsafeJCE で生成されたキーに BC lib で署名できないのはなぜですか?

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 に答える