椭圆曲线点

RAV*_*ADA 3 java cryptography bouncycastle

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

Ras*_*ber 15

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

你用加密法标记了这个问题,所以我假设你在询问有限域上的椭圆曲线.曲线将有一个发电机,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); 
Run Code Online (Sandbox Code Playgroud)

  • @Rasmus,当你有堆栈溢出时需要接受教育. (5认同)