金鑰是構建位元幣信任網路的核心要素。金鑰通常包括私鑰和公鑰兩部分。其中私鑰用於生成簽名、公鑰用於生成位址。
位元幣的金鑰採用橢圓曲線演算法 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...