2011-07-12 256 views
2

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

+1

是不是有更多的数学问题吗? “我如何检查一个点是否在曲线上?” – Thomas

+0

通过标签判断,我猜OP要求与http://en.wikipedia.org/wiki/Elliptic_curve_cryptography –

回答

12

检查点是否在椭圆曲线上很容易。只需检查您的点(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和一个订单。 要获得一个随机点,只需生成一个随机整数,即x,介于0和(order-1)之间,并选择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); 
+0

有关,请提供示例代码以获得使用弹性城堡的椭圆曲线上的点.... .. –

+0

@ user605343:完成 –

+5

@Rasmus,当你有堆栈溢出时需要接受教育。 –