0

请为我提供一个使用 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());

而且我也不明白首先BigIntegerECFiledElement.

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是定义字段的素数。

您的示例的第二个问题是,并非每对 (x,y) 整数都是椭圆曲线上的一个点。随机 (x,y) 出现在 P-224 上的机会非常小。同样,通过弄乱低级 EPoint 类,Bouncycastle 不会为您检查这一点。因此,虽然您可以让椭圆曲线加法软件的机器运行并给您答案,但这些答案毫无意义。

为了取得更多进展,我首先要问:你想做什么?

编辑:

有两种基本方法可以在椭圆曲线上找到一个点。

  1. 在曲线上取一个现有的已知点,然后标量乘以一个整数。结果是曲线上的另一个点。
  2. 选择一个 x 坐标,比如 x1。将其代入椭圆曲线公式的右侧得到 y1^2 = E(x1)。然后尝试在该字段中计算平方根。如果平方根存在,那么您会得到曲线上的两个点 (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 回答