椭圆曲线点

时间:2011-07-12 12:05:26

标签: java cryptography bouncycastle

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

2 个答案:

答案 0 :(得分:14)

检查点是否在椭圆曲线上很容易。只需检查您的点(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); 

答案 1 :(得分:0)

不知道您的公式将是哪种语言:

x ^ 3 + b-y ^ 2 = 0

如果不正确,则您的点不在曲线上。我使用big-integer这样编写了一个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