2011-07-12 306 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,當你有堆棧溢出時需要接受教育。 –