椭圆曲线加密

RAV*_*ADA 0 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());
Run Code Online (Sandbox Code Playgroud)

而且我也没明白什么价值在于提供了第一个BigIntegerECFiledElement.

Jam*_*olk 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"));
Run Code Online (Sandbox Code Playgroud)

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,则平方根不存在.