Java 椭圆曲线点

Java 椭圆曲线点,java,cryptography,bouncycastle,Java,Cryptography,Bouncycastle,目前我正在做一个使用椭圆曲线的项目。请为我提供一个解决方案,确定一个点是否在椭圆曲线上?以及如何在椭圆曲线上得到一个点检查一个点是否在椭圆曲线上很容易。只需检查点(x,y)是否满足定义椭圆曲线的方程:y^2=x^3+ax+b(记住在正确的字段中执行计算) 使用Bouncycastle,您可以这样做: ECCurve curve = //... ECFieldElement x = //... ECFieldElement y = //... ECFieldElement a = curve.g

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

检查一个点是否在椭圆曲线上很容易。只需检查点
(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);
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); 
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)
}
你已经用密码学标记了这个问题,所以我假设你在问有限域上的椭圆曲线。曲线将有一个生成器,g和一个顺序。 要获得一个随机点,只需生成一个介于0和(顺序-1)之间的随机整数,x,然后选择x*g

您可以使用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);
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); 
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)
}

在不知道您的公式是什么语言的情况下:

x^3+b-y^2=0

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

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);
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); 
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)
}
如果您想查看验证、加法、倍增、乘法和减法的数学实现,请参阅以下链接:

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

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


这不是一个数学问题吗?“我如何检查一个点是否在曲线上?”根据标签判断,我猜OP是在询问,请提供示例代码,使用bouncy castle获取椭圆曲线上的点……@Rasmus,当你有堆栈溢出时,谁需要教育呢?非常感谢…请再给我一个帮助,就是椭圆曲线点乘以1和-1的结果是一样的?我试过了,得到了相同的点,但理论上非常感谢你…椭圆曲线点与1和-1的乘积是相同的点吗??我尝试了,得到了相同的点,但理论上是错误的。@user605343:不。我不确定Bouncycastle的ECPoint.multiply对负数是否正确,但你可以尝试使用x*p=(n+x)*p(其中n是阶数,x是整数,p是椭圆曲线点)。然后-1*p=(n-1)*p,Bouncycastle应该能够计算出。