Java 椭圆曲线加密
请提供一个使用Bouncycastle库的示例,演示如何在椭圆曲线上添加两点 我尝试了下面的代码,但没有得到理论上应该得到的结果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
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
中为firstbiginger
提供的值是什么,您的示例毫无意义,因此很难理解您认为结果应该是什么。通过使用诸如ECFieldElement
之类的低级类,您完全有责任提供合理的参数。您已选择NIST曲线P-224。这个椭圆曲线是在一个特定的域上定义的。您可以检索此有限域的素数“q”,并使用它通过以下方式创建域元素(与您的示例不同):
ECFieldElement.Fp
构造函数的第一个参数是定义字段的素数
示例的第二个问题是,并非每对(x,y)整数都是椭圆曲线上的一个点。随机(x,y)出现在P-224上的几率非常小。这里再次强调,Bouncycastle在处理低级EPoint类时并没有为您检查这一点。所以,虽然你可以让椭圆曲线加法软件的机器运行并给出答案,但这些答案毫无意义
要取得更多的进展,我首先要问:你想做什么
编辑:
找到椭圆曲线上的点有两种基本方法
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类时并没有为您检查这一点。所以,虽然你可以让椭圆曲线加法软件的机器运行并给出答案,但这些答案毫无意义
要取得更多的进展,我首先要问:你想做什么
编辑:
找到椭圆曲线上的点有两种基本方法
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"));