【问题标题】:Elliptic curve point椭圆曲线点
【发布时间】:2011-07-12 12:05:25
【问题描述】:

目前我正在做一个使用椭圆曲线的项目。请提供一个解决方案来确定一个点是否在椭圆曲线上?以及如何在椭圆曲线上得到一个点

【问题讨论】:

标签: java cryptography bouncycastle


【解决方案1】:

检查一个点是否在椭圆曲线上很容易。只需检查您的点 (x,y) 是否满足定义椭圆曲线的方程:y^2 = x^3 + ax + b(请记住在正确的字段中执行计算)。

使用 Bouncycastle 你可以这样做:

ECCurve curve = //...
ECFieldElement x = //...
ECFieldElement y = //...

ECFieldElement a = curve.getA();
ECFieldElement b = curve.getB();
ECFieldElement lhs = y.multiply(y);
ECFieldElement rhs = x.multiply(x).multiply(x).add(a.multiply(x)).add(b);

boolean pointIsOnCurve = lhs.equals(rhs);

你已经用密码学标记了这个问题,所以我假设你问的是有限域上的椭圆曲线。曲线将有一个生成器 g 和一个订单。 要获得一个随机点,只需生成一个介于 0 和 (order - 1) 之间的随机整数 x,然后选择 x * g

您可以像这样使用 Bouncycastle 做到这一点:

X9ECParameters x9 = NISTNamedCurves.getByName("P-224"); // or whatever curve you want to use
ECPoint g = x9.getG();
BigInteger n = x9.getN();
int nBitLength = n.bitLength();
BigInteger x;
do
{
    x = new BigInteger(nBitLength, random);
}
while (x.equals(ZERO)  || (x.compareTo(n) >= 0));
ECPoint randomPoint = g.multiply(x); 

【讨论】:

  • 请提供示例代码以使用充气城堡在椭圆曲线上获取一个点......
  • @Rasmus,当您遇到堆栈溢出时需要接受教育。
  • 非常感谢...请再帮忙一个椭圆曲线点乘以1和-1的结果一样吗?我试过了,得到了同样的观点,但理论上是
  • 非常感谢...椭圆曲线点与1和-1的乘积是同一个点吗?我试过了,得到了同样的观点,但理论上是错误的。
  • @user605343:不。我不确定 Bouncycastle 的 ECPoint.multiply 是否能正确处理负数,但您可以尝试使用 x*p = (n+x)*p,(其中 n是阶数,x 是整数,p 是椭圆曲线点)。然后 -1*p = (n-1)*p,Bouncycastle 应该能够计算出来。
【解决方案2】:

不知道你的公式是什么语言:

x^3+b - y^2 = 0

如果这不是真的,那么你的点不在曲线上。我使用这样的大整数编写了一个 javascript 实现:

verify(point) {
  const verificationPoint = this.modSet.subtract(
    this.modSet.add(this.modSet.power(point.x, 3), this.b),
    this.modSet.power(point.y, 2)
   )
  return bigInt(verificationPoint).equals(0)
}

如果您想查看验证、加法、加倍、乘法和减法的数学实现,请参阅以下链接:

https://www.npmjs.com/package/simple-js-ec-math

https://github.com/Azero123/simple-js-ec-math

如果您正在学习椭圆曲线数学的工作原理,我建议您遵循本指南:

https://eng.paxos.com/blockchain-101-foundational-math

网上有很多关于如何提高代码性能的描述:

https://en.wikipedia.org/wiki/Elliptic_curve_point_multiplication

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-14
    • 2018-05-20
    相关资源
    最近更新 更多