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
から取得します。解決策はありますか?PrivateKey
ec