Java 椭圆曲线加密

Java 椭圆曲线加密,java,bouncycastle,elliptic-curve,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")); ECFiel

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

而且我也不明白在
ECFiledElement

中为first
biginger
提供的值是什么,您的示例毫无意义,因此很难理解您认为结果应该是什么。通过使用诸如
ECFieldElement
之类的低级类,您完全有责任提供合理的参数。您已选择NIST曲线P-224。这个椭圆曲线是在一个特定的域上定义的。您可以检索此有限域的素数“q”,并使用它通过以下方式创建域元素(与您的示例不同):

ECFieldElement.Fp
构造函数的第一个参数是定义字段的素数

示例的第二个问题是,并非每对(x,y)整数都是椭圆曲线上的一个点。随机(x,y)出现在P-224上的几率非常小。这里再次强调,Bouncycastle在处理低级EPoint类时并没有为您检查这一点。所以,虽然你可以让椭圆曲线加法软件的机器运行并给出答案,但这些答案毫无意义

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

编辑:

找到椭圆曲线上的点有两种基本方法

  • 取曲线上现有的已知点,将标量乘以整数。结果是曲线上的另一个点
  • 选择一个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,则平方根不存在。

    您的示例毫无意义,因此很难理解您认为结果应该是什么。通过使用诸如
    ECFieldElement
    之类的低级类,您完全有责任提供合理的参数。您已选择NIST曲线P-224。这个椭圆曲线是在一个特定的域上定义的。您可以检索此有限域的素数“q”,并使用它通过以下方式创建域元素(与您的示例不同):

    ECFieldElement.Fp
    构造函数的第一个参数是定义字段的素数

    示例的第二个问题是,并非每对(x,y)整数都是椭圆曲线上的一个点。随机(x,y)出现在P-224上的几率非常小。这里再次强调,Bouncycastle在处理低级EPoint类时并没有为您检查这一点。所以,虽然你可以让椭圆曲线加法软件的机器运行并给出答案,但这些答案毫无意义

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

    编辑:

    找到椭圆曲线上的点有两种基本方法

  • 取曲线上现有的已知点,将标量乘以整数。结果是曲线上的另一个点
  • 选择一个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,则平方根不存在。

    谢谢,我们要做的是将椭圆曲线点乘以1或-1。即使我们与-1相乘,我们也得到了相同的点,而不是在理论上复制该点…类似地,我们尝试了加法,但没有得到相同的结果…两个EC点的加法公式是:给定p(x1,y1)和Q(x2,y2),那么x3=slope-x1-x2和y3=-y1+slope(x1-x3)。你的示例点无效,因此,自然地对它们执行椭圆曲线运算并不会产生预期的结果。同样,你不能简单地把坐标(x,y)组合起来,然后期望它们在一条特定的曲线上。谢谢,我们要做的是,把一个椭圆曲线点乘以1或-1。即使我们与-1相乘,我们也得到了相同的点,而不是在理论上复制该点…类似地,我们尝试了加法,但没有得到相同的结果…两个EC点的加法公式是:给定p(x1,y1)和Q(x2,y2),那么x3=slope-x1-x2和y3=-y1+slope(x1-x3)。你的示例点无效,因此,自然地对它们执行椭圆曲线运算并不会产生预期的结果。同样,您不能简单地构造坐标(x,y)并期望它们位于特定曲线上。
        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"));