椭圆曲线加密

时间:2011-07-11 09:28:34

标签: java bouncycastle elliptic-curve

请使用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的价值是什么。

1 个答案:

答案 0 :(得分:5)

你的例子毫无意义,因此很难理解你认为结果应该是什么。通过使用像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。将其插入elliptic curve formula的右侧到y1 ^ 2 = E(x1)。然后尝试计算字段中的平方根。如果存在平方根,则得到曲线上的两个点(x1,y1)和(x1,-y1)。如果平方根不存在,那么曲线上没有x坐标x1。
  3. 您可以通过ECPoint.Fp = (ECPoint.Fp)x9.getG();在椭圆曲线上得到一个点。您可以将该点乘以ECPoint.multiply(...)的整数。

    使用方法#2比使用Bouncycastle更难。所有方法都在ECPoint和ECFieldElement类中。 ECFieldElement类包含可用于尝试计算平方根的公共平方根方法。如果它返回null,那么平方根不存在。