Javaで楕円曲線KeyPair
sを生成するための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プロバイダーはEC
、ECDSA
、ECDH
の3つのアルゴリズム名すべてをサポートしていますが、JDKのデフォルトプロバイダーはEC
のみをサポートしています。
なぜ矛盾があるのですか?これらのアプローチのいずれかで使用される結果のキーに意味のある違いはありますか?
Oracle Javaのドキュメントはこのトピックについて少しまばらですが、SunJCEのように見えます。asEC
で生成されたキーはECDHまたはECDSAのどちらでも使用できます。(- ソース ):
(私は楕円曲線の専門家ではありませんが)理論的には、ECDHとECDSAの ドメインパラメータ は同じ形、つまり曲線の方程式と基点G
(CURVE, G)
(展開されたフォームがよく表示されます
(p, a, b, G, n, h)
場所p, a, b
は曲線の方程式であり、n, h
はG
から派生した値で、計算を節約するために提供されます)
そして、両方のアルゴリズムのキーペアは同じです、すなわち:
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を通過するのが面倒ですが、EC
、ECDH
、およびECDSA
はすべて同じエイリアスです。混乱を避けるためにそこに置いてください。