六 區塊鏈資料結構 金鑰對 公鑰和私鑰

2021-08-18 10:08:54 字數 2926 閱讀 2280

金鑰是構建位元幣信任網路的核心要素。金鑰通常包括私鑰和公鑰兩部分。其中私鑰用於生成簽名、公鑰用於生成位址。

位元幣的金鑰採用橢圓曲線演算法 secp256k1來生成。secp256k1曲線的大致形狀如下:

該曲線的數學表達是為:y^2 \ \% \ p=(x^3+7) \ \%\ py2

%p=(

x3+7

)%p,其中

p=2^ - 2^ - 2^9 - 2^8 - 2^7 - 2^6 - 2^4 - 1p=

2256

−232

−29−

28−2

7−26

−24−

1在生成秘鑰時,回先選取乙個基點g。然後生成乙個256位的隨機數k,該隨機數即為私鑰。然後通過橢圓隨機曲線乘法,得出曲線上的乙個點k,k即為公鑰。其中k=k*gk=

k∗g,注意該公式,以目前的算力幾乎是不可逆的。因此可以通過私鑰計算公鑰,但是目前無法通過公鑰反推出私鑰。具體的秘鑰生成過程,參見[1] 橢圓曲線演算法

因為公鑰為橢圓曲線的上的點,因此可以用其座標來標識。因為y可以通過x計算出來,因此通常只儲存和傳輸橫座標x。因為曲線相對x軸對稱,因此通過x計算出的y值會包含正負兩項,因此通常在公鑰資料前,加乙個標識位,來標識是否儲存了y值或儲存的y值為整數還是負數。

公鑰的資料格式如下:

其中標誌位如果為04,代表公鑰採用未壓縮的格式儲存,如果標誌位為02或03,則代表公鑰採用壓縮格式儲存,02代表y的為正數,03代表y為負數。

核心變數定義

//位元幣使用的secp256k1橢圓曲線引數

private

static

final x9ecparameters curve_params = customnamedcurves.

getbyname

("secp256k1");

/** the parameters of the secp256k1 curve that bitcoin uses. */

public

static

final ecdomainparameters curve;

/** * equal to curve.getn().shiftright(1), used for canonicalising the s value of a signature. if you aren't

* sure what this is about, you can ignore it.

* 等於曲線最大值域右移一位,作為簽名s值的基數

*/public

static

final biginteger half_curve_order;

private

static

final securerandom securerandom;

static

// the two parts of the key. if "priv" is set, "pub" can always be calculated. if "pub" is set but not "priv", we

// can only verify signatures not make them.

// 金鑰的兩部分:公鑰和私鑰。通過私鑰可以計算公鑰,通過公鑰無法反退出私鑰。

// 當只設定了公鑰而未設定私鑰時,該金鑰智慧型用於簽名驗證,不能用於簽名生成

protected

final biginteger priv;

// a field element.

protected

final lazyecpoint pub;

生成秘鑰物件
/**

* generates an entirely new keypair with the given object. point compression is used so the

* resulting public key will be 33 bytes (32 for the co-ordinate and 1 byte to represent the y bit).

* 通過提供的隨機數生成器,生成完整的金鑰對。

* 生成的公鑰包含33個位元組,其中x座標占用32額位元組,y座標占用1個位元組(因為y值可以通過x只計算出來,因此這個位元組用於標識正負)

*/public

eckey

(securerandom securerandom)

生成公鑰和私鑰
/**

* given the domain parameters this routine generates an ec key

* pair in accordance with x9.62 section 5.2.1 pages 26, 27.

*/public asymmetriccipherkeypair generatekeypair()

if(wnafutil.

getnafweight

(d)< minweight)

break;}

ecpoint q =

createbasepointmultiplier()

.multiply

(params.

getg()

, d)

;return

newasymmetriccipherkeypair

(new

ecpublickeyparameters

(q, params)

,new

ecprivatekeyparameters

(d, params)

);

}

一點區塊鏈資料

1 今天找資料,無意中看到15年底 16年初弄的關於區塊鏈的資料,當時寫了個交流匯報區塊鏈的ppt,感覺挺好的,共享下,希望能幫助朋友們理解區塊鏈。2 背景 15年底,老闆從朋友那裡聽說區塊鏈,據說外國很火,想趁著國內還不多,看看有啥機會沒,比如申請個專利啥的,帶著幾個人兼職做了研究,弄了好幾個月。...

一點區塊鏈資料 copy

1 今天找資料,無意中看到15年底 16年初弄的關於區塊鏈的資料,當時寫了個交流匯報區塊鏈的ppt,感覺挺好的,共享下,希望能幫助朋友們理解區塊鏈。2 背景 15年底,老闆從朋友那裡聽說區塊鏈,據說外國很火,想趁著國內還不多,看看有啥機會沒,比如申請個專利啥的,帶著幾個人兼職做了研究,弄了好幾個月。...

資料結構實驗六 鏈佇列

include include int flag 0 typedef struct qnode qnode,qnodeptr typedef struct linkqueue linkqueue void initqueue linkqueue q void createqueue linkqueu...