请为我提供一个使用 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
中的第一个 BigInteger
提供什么值。
最佳答案
你的例子根本没有意义,所以很难理解你认为结果应该是什么。通过使用像 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 不会为您检查这一点。因此,虽然您可以运行椭圆曲线加法软件的机制并给出答案,但这些答案毫无意义。
为了取得更多进展,我必须首先问:你想做什么?
在椭圆曲线上查找点
在椭圆曲线上查找点有两种基本方法。
- 取曲线上现有的已知点并将标量乘以整数。结果是曲线上的另一个点。
- 选择一个 x 坐标,例如 x1。将其插入 elliptic curve formula 的右侧得到 y12 = E(x1)。然后尝试计算字段中的平方根。如果平方根存在,那么您将得到两个点 (x1, y1) 和 (x1,-y1 )位于曲线上。如果平方根不存在,则曲线上不存在 x 坐标为 x1 的点。
您可以通过以下方式获得椭圆曲线上的一个点:ECPoint.Fp = (ECPoint.Fp)x9.getG();
您可以将该点乘以一个带有ECPoint 的整数。乘法(...)
。
使用方法 #2 比使用 BouncycaSTLe 更难。所有方法都位于 ECPoint 和 ECFieldElement 类中。 ECFieldElement 类包含一个公共(public)平方根方法,您可以使用该方法来尝试计算平方根。如果返回 null,则平方根不存在。
关于java - 椭圆曲线加密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6648166/