2013-10-31 67 views
0

我需要一些幫助,在C#或Java 中移植OpenSSL函數EC_POINT_set_compressed_coordinates_GFp如何在Bouncy Castle中實現OpenSSL的EC_POINT_set_compressed_coordinates_GFp?

儘管我可以使用Bouncy Castle(首選),但我可以從頭開始構建它。

的C++方法簽名看起來像這樣:

int EC_POINT_set_compressed_coordinates_GFp(const EC_GROUP *group, EC_POINT *p, 
    const BIGNUM *x, int y_bit, BN_CTX *ctx); 

從OpenSSL的:

點也可以在它們的壓縮座標來描述。對於一個點(x,y),對於x的任何給定值,使得該點在曲線上,y將只有兩個可能的值。因此,可以使用EC_POINT_set_compressed_coordinates_GFp和EC_POINT_set_compressed_coordinates_GF2m函數設置一個點,其中x是x座標,y_bit是值0或1,以確定應使用y的兩個可能值中的哪一個。

任何人都可以在需要幫助的數學?我無法理解源文件,並希望確保正確移植它

回答

2

此功能的用途是使用提供的x座標和y_bit設置點P。您可以將[x-coordinate,y_bit]視爲(x座標,y座標)的壓縮形式;兩者代表點P.

在維爾斯特拉斯方程(GFP)

y^2 = x^3 + a*x + b, 

假設y是在它的模數形式(0 < = Y < P),然後y_bit是LSB的收率正如你所看到的,y是x^3 + a * x + b的平方根之一。並且可以證明每個根具有不同的y_bit。這就是爲什麼你可以使用y_bit來確定應該使用哪個y(根)。

採取ec_GFp_simple_set_compressed_coordinatesecp_oct.c(的OpenSSL 1.0.1e)爲例,這裏就是它的作用:

  • 地計算x^3 + A * X + B
  • 計算Y,X的平方根^ 3 + a * x + b
  • 將y_bit與y的LSB進行比較。如果不同,Y = -y(模p)
  • 集的仿射座標(X,Y)到P點
+0

謝謝!我打算再打開一段時間,希望有人(或我會)用C#或Java發佈Bouncy Castle源代碼 – LamonteCristo

+0

您可以詳細說明一下,或者爲步驟2和步驟3提供一些代碼/僞代碼。在這些步驟中, Ÿ應該是原始的或模數的形式? – PassKit

相關問題