0

楕円曲線に 2 つの点を追加する方法を示す Bouncycastle ライブラリを使用した例を教えてください。

次のコードを試しましたが、理論的に発生するはずの同じ結果が得られませんでした。

   X9ECParameters x9=NISTNamedCurves.getByName("P-224");
   ECCurve curve=x9.getCurve();
   ECFieldElement x1=new ECFieldElement.Fp(new BigInteger("10"), new BigInteger("8"));
   ECFieldElement y1=new ECFieldElement.Fp(new BigInteger("10"), new BigInteger("9"));
   ECPoint.Fp p1=new ECPoint.Fp(curve, x1, y1);
   ECFieldElement x2=new ECFieldElement.Fp(new BigInteger("10"), new BigInteger("5"));
   ECFieldElement y2=new ECFieldElement.Fp(new BigInteger("10"), new BigInteger("6"));
   ECPoint.Fp p2=new ECPoint.Fp(curve, x2, y2);
   p2=(ECPoint.Fp) p1.add(p2);
   System.out.println(p2.getX().toBigInteger()+" "+p2.getY().toBigInteger());

また、最初BigIntegerに提供する価値が何であるかを理解していませんでしたECFiledElement

4

1 に答える 1

6

あなたの例はまったく意味がないので、結果がどうあるべきかを理解するのは難しいです. あなたのような低レベルのクラスを使用ECFieldElementすることで、適切なパラメーターを提供する全責任を負います。NIST 曲線 P-224 を選択しました。この楕円曲線は、特定のフィールドで定義されます。この有限体の素数 'q' を取得し、それを使用して次の方法で体要素を作成できます (例から離れています)。

    X9ECParameters x9 = NISTNamedCurves.getByName("P-224");
    ECCurve.Fp curve = (Fp) x9.getCurve();
    BigInteger q = curve.getQ();
    ECFieldElement x1 = new ECFieldElement.Fp(q, new BigInteger("8"));
    ECFieldElement y1 = new ECFieldElement.Fp(q, new BigInteger("9"));

コンストラクターの最初の引数はECFieldElement.Fp、フィールドを定義する素数です。

あなたの例の2番目の問題は、整数のすべてのペア(x​​、y)が楕円曲線上の点ではないことです。P-224 にランダムな (x,y) が存在する可能性は非常に低いです。ここでも、低レベルの EPoint クラスをいじっても、Bouncycastle はこれをチェックしません。したがって、楕円曲線加算ソフトウェアの機械を実行して答えを出すことはできますが、それらの答えは無意味です。

さらなる進歩を遂げるために、最初に尋ねなければならないことがあります。あなたは何をしようとしていますか?

編集:

楕円曲線上の点を見つけるには、2 つの基本的な方法があります。

  1. 曲線上の既存の既知のポイントを取得し、スカラーに整数を掛けます。結果は、曲線上の別のポイントです。
  2. x 座標、たとえば x1 を選びます。これを楕円曲線の式の右辺に当てはめて y1^2 = E(x1) とします。次に、フィールドの平方根を計算しようとします。平方根が存在する場合、曲線上にある 2 つの点 (x1, y1) と (x1,-y1) が得られます。平方根が存在しない場合、曲線上に x 座標 x1 の点はありません。

で楕円曲線上の点を取得できます。ECPoint.Fp = (ECPoint.Fp)x9.getG();その点に整数を掛けることができますECPoint.multiply(...)

方法 2 を使用すると、Bouncycastle で必要以上に難しくなります。すべてのメソッドは ECPoint および ECFieldElement クラスにあります。ECFieldElement クラスには、平方根の計算に使用できる公開平方根メソッドが含まれています。null を返す場合、平方根は存在しません。

于 2011-07-12T00:01:30.280 に答える