请使用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
的价值是什么。
答案 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不会为你检查这个。因此,虽然你可以运行椭圆曲线加法软件的机器并给你答案,但这些答案毫无意义。
为了取得更多进展,我首先要问:你想做什么?
编辑:
在椭圆曲线上找到一个点有两种基本方法。
您可以通过ECPoint.Fp = (ECPoint.Fp)x9.getG();
在椭圆曲线上得到一个点。您可以将该点乘以ECPoint.multiply(...)
的整数。
使用方法#2比使用Bouncycastle更难。所有方法都在ECPoint和ECFieldElement类中。 ECFieldElement类包含可用于尝试计算平方根的公共平方根方法。如果它返回null,那么平方根不存在。