1

RSA、DSA、ECDSA の 3 つのテスト キーがあります。RSA および DSA キーベースの署名は、検証時に true を返します。ただし、ECDSA ベースの署名は常に false を返します (署名が一致する場合でも)。

3 つのテスト キーすべてを検証するために同じコードが使用されます ( に渡されるプロバイダ オブジェクトの違いは別としてSignature.getInstance())。私のコードは次のとおりです。

Signature ecdsa = Signature.getInstance("SHA1withECDSA");
ecdsa.initSign(pk);
ecdsa.update(rawKeyBytes);
byte[] signatureBytes = ecdsa.sign(); 

Signature ecdsa3 = Signature.getInstance("SHA1WithECDSA");
ecdsa3.initVerify(puk);  
ecdsa3.update(rawKeyBytes);
System.out.println("Verifying: "+ecdsa3.verify(signatureBytes));

プログラムの出力は常にVerifying: falseです。プロバイダーを変更しSHA1WithRSAて RSA キーを使用すると (上記と同じコードを使用)、DSA ベースのキーと同じように検証で true が返されます。次のように秘密鍵から公開鍵を作成しようとしたときECPointに、コンストラクターに渡されたものと関係があると誰かが言いました。ECPublicKeySpec()

ECPrivateKey ec = (ECPrivateKey) privateKey;
ECPublicKeySpec ecKeySpec = new ECPublicKeySpec(
    ec.getParams().getGenerator(),
    ec.getParams()
);

秘密鍵とは異なる署名を使用すると、(公開鍵を使用した) 署名の検証が失敗すると誰かが言いECPointました。しかし、実際にはオブジェクト ( )ECPointから取得します。解決策はありますか?PrivateKeyec

4

0 に答える 0