2011-07-11 210 views
0

請提供使用BouncyCastle的庫展示瞭如何橢圓曲線上加兩個點的例子。橢圓曲線加密

我嘗試下面的代碼,但我沒有得到這理論上應該發生同樣的結果。

X9ECParameters x9=NISTNamedCurves.getByName("P-224"); 
    ECCurve curve=x9.getCurve(); 
    ECFieldElement x1=new ECFieldElement.Fp(new BigInteger("10"), new BigInteger("8")); 
    ECFieldElement y1=new ECFieldElement.Fp(new BigInteger("10"), new BigInteger("9")); 
    ECPoint.Fp p1=new ECPoint.Fp(curve, x1, y1); 
    ECFieldElement x2=new ECFieldElement.Fp(new BigInteger("10"), new BigInteger("5")); 
    ECFieldElement y2=new ECFieldElement.Fp(new BigInteger("10"), new BigInteger("6")); 
    ECPoint.Fp p2=new ECPoint.Fp(curve, x2, y2); 
    p2=(ECPoint.Fp) p1.add(p2); 
    System.out.println(p2.getX().toBigInteger()+" "+p2.getY().toBigInteger()); 

而且我也沒明白什麼價值是在ECFiledElement提供第一BigInteger

回答

4

你舉的例子是沒有意義的,所以很難理解你想結果應該是。通過使用ECFieldElement等低級課程,您將全權負責提供合理的參數。您已選擇NIST曲線P-224。這個橢圓曲線是在特定的領域上定義的。您可以檢索此有限域素「Q」,並用它通過以下內容來創建域元素(從你的例子出發):

X9ECParameters x9 = NISTNamedCurves.getByName("P-224"); 
    ECCurve.Fp curve = (Fp) x9.getCurve(); 
    BigInteger q = curve.getQ(); 
    ECFieldElement x1 = new ECFieldElement.Fp(q, new BigInteger("8")); 
    ECFieldElement y1 = new ECFieldElement.Fp(q, new BigInteger("9")); 

ECFieldElement.Fp構造函數的第一個參數是定義該領域的主要。

與您的例子中的第二個問題是不是每個整數對(x,y)是橢圓曲線上的點。隨機(x,y)在P-224上的機會非常小。再次,通過與低級EPoint類混合,Bouncycastle不會爲您檢查這一點。因此,儘管您可以使橢圓曲線附加軟件的機器運行並給出答案,但這些答案是毫無意義的。

爲了讓更多的進步我必須先問:什麼是你想怎麼辦?

編輯:

有兩種基本方式找到一個橢圓曲線上的點。

  1. 取曲線上已有的已知點和標量乘以整數。結果是曲線上的另一點。
  2. 選取一個x座標,比如x1。將其插入elliptic curve formula的右側以y1^2 = E(x1)。然後嘗試計算字段中的平方根。如果平方根存在,則會得到曲線上的兩個點(x1,y1)和(x1,-y1)。如果平方根不存在,則曲線上沒有x座標x1的點。

你可以通過你的ECPoint.Fp = (ECPoint.Fp)x9.getG();橢圓曲線上的點您可以通過與ECPoint.multiply(...)整數相乘這一點。

使用方法#2是難度比它需要與BouncyCastle的。所有的方法都在ECPoint和ECFieldElement類中。 ECFieldElement類包含可用於嘗試計算平方根的公共平方根方法。如果它返回null,那麼平方根不存在。

+0

謝謝,我們試圖做的是,乘以1或-1的橢圓曲線點。即使我們乘以-1,我們也得到了相同的點,而不是那個點的複製...類似地,我們嘗試添加,但我們沒有得到相同的結果... –

+0

添加兩個ECPoint的公式是:給定p(x1,y1)和Q(x2,y2),則x3 = slope-x1-x2並且y3 = -y1 + slope(x1-x3) –

+0

您的示例點無效,因此自然對它們執行橢圓曲線運算不會產生預期的結果。再次,你不能簡單地組成座標(x,y),並期望它們在特定的曲線上。 –