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)
而且我也没明白什么价值在于提供了第一个BigInteger在ECFiledElement.
你的例子完全没有意义,因此很难理解你认为结果应该是什么.通过使用像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不会为你检查这个.因此,虽然您可以使椭圆曲线加法软件的机器运行并给您答案,但这些答案毫无意义.
为了取得更多进展,我首先要问:你想做什么?
编辑:
在椭圆曲线上找到一个点有两种基本方法.
您可以在椭圆曲线上得到一个点.ECPoint.Fp = (ECPoint.Fp)x9.getG();您可以将该点乘以一个整数ECPoint.multiply(...).
使用方法#2比使用Bouncycastle更难.所有方法都在ECPoint和ECFieldElement类中.ECFieldElement类包含可用于尝试计算平方根的公共平方根方法.如果它返回null,则平方根不存在.
| 归档时间: |
|
| 查看次数: |
1881 次 |
| 最近记录: |