web-dev-qa-db-ja.com

JDK標準EC KeyPairGeneratorは、ECDSAアルゴリズムとECDHアルゴリズムの両方での使用に適していますか?

Javaで楕円曲線KeyPairsを生成するためのWeb上のさまざまな参照を確認しましたが、2つの最も一般的に参照される例は(当然のことながら)JDKのデフォルトプロバイダーとBouncyCastleを使用しています。

しかし、私を混乱させるのは、JDKのデフォルトプロバイダー supportsKeyPairGeneratorの単一のECアルゴリズム名と、BouncyCastleがそれと、ECDSAおよびECDHの2つの追加の異なるアルゴリズム名をサポートすることです。

JDKデフォルトプロバイダーの例:

KeyPairGenerator g = KeyPairGenerator.getInstance("EC");
ECGenParameterSpec spec = new ECGenParameterSpec("secp256r1");
g.initialize(spec);
KeyPair keyPair = g.generateKeyPair();

BouncyCastleプロバイダーのECDSAの例:

KeyPairGenerator g = KeyPairGenerator.getInstance("ECDSA", "BC");
ECGenParameterSpec spec = new ECGenParameterSpec("secp256r1");
g.initialize(spec);
KeyPair keyPair = g.generateKeyPair();

BouncyCastleプロバイダーのECDHの例:

KeyPairGenerator g = KeyPairGenerator.getInstance("ECDH", "BC");
ECGenParameterSpec spec = new ECGenParameterSpec("secp256r1");
g.initialize(spec);
KeyPair keyPair = g.generateKeyPair();

要約すると、BouncyCastleプロバイダーはECECDSAECDHの3つのアルゴリズム名すべてをサポートしていますが、JDKのデフォルトプロバイダーはECのみをサポートしています。

なぜ矛盾があるのですか?これらのアプローチのいずれかで使用される結果のキーに意味のある違いはありますか?

1
Les Hazlewood

Oracle Javaのドキュメントはこのトピックについて少しまばらですが、SunJCEのように見えます。asECで生成されたキーはECDHまたはECDSAのどちらでも使用できます。(- ソース ):

SunEC provider algorithm specs

(私は楕円曲線の専門家ではありませんが)理論的には、ECDHとECDSAの ドメインパラメータ は同じ形、つまり曲線の方程式と基点G

(CURVE, G)

展開されたフォームがよく表示されます

(p, a, b, G, n, h)

場所p, a, bは曲線の方程式であり、n, hGから派生した値で、計算を節約するために提供されます

そして、両方のアルゴリズムのキーペアは同じです、すなわち:

priv_key: an integer d in [1, n-1]
pub_key: a point on the curve Q = (x,y) = d*G

結論:はい、キーはECDHとECDSAの間で交換可能です。 Oracleのドキュメントを掘り下げたので、私もBouncy Castleを通過するのが面倒ですが、ECECDH、およびECDSAはすべて同じエイリアスです。混乱を避けるためにそこに置いてください。

1
Mike Ounsworth