區塊鏈學習(1)密鑰,公鑰和地址


  想學好區塊鏈不了解底層技術是不行的,目前有關區塊鏈的學習資料還不是很多,所以我也是摸着石頭過河,本人文筆拙劣,有些表達不清楚的地方還望各位多多包涵。這里所根據基本都是比特幣的技術,可以參考下《精通比特幣》。

這一章主要講的是私鑰,公鑰和地址,這三者的關系可以用《精通比特幣》中的一張圖來表示。

  簡單來說就是私鑰通過計算生成公鑰, 公鑰又通過了另一種計算生成了地址,而這兩種計算是不可逆的,也就是說私鑰可以通過計算生成公鑰但得到了公鑰你卻無法得到生成這個公鑰的私鑰,公鑰和地址的關系也一樣是單向的。

  至於什么是私鑰,公鑰和地址。私鑰就是一個隨機數,就像是擲骰子得到的數,只不過這個隨機數比較大,是一個256位的二進制數。在交易中,私鑰用於生成支付比特幣所必需的簽名以證明資金的所有權。私鑰必須始終保持機密。私鑰一旦丟失,其所保護的比特幣也將永遠丟失。在比特幣中生成私鑰一般是通過隨機取出一長串隨機字節,對其使用SHA256哈希算法進行運算,可以簡單理解為產生一個256位的數字。如果運算結果小於n-1(n為常數,略小於2^256),就有了一個合適的私鑰。否則,就用另一個隨機數再重復一次。

  公鑰可以由橢圓曲線算法實現。關於橢圓曲線算法,可以看一下https://blog.csdn.net/jingcheng345413/article/details/54969289,應該是講的很詳細了。橢圓曲線算法是一種不可逆的加密算法。比特幣采用的是y^2 mod p = (x^3+ 7) mod p。也就是secp256k1標准所定義的一條特殊的橢圓曲線和一系列數學常數。

看一下y^2=x^3+x+1  (mod 23)的圖像

這里得到的圖像是一個個離散的點,比特幣中的類似,只不過素數p是一個很大的數,因此得到圖像是一個更大,圖像更復雜。上面就是橢圓曲線。現在講講如何生成公鑰。

{K = k * G}

其中k是私鑰,G是生成點,可以理解為1,2,3,4,5之類的數。在該曲線上所得的點K是公鑰。至於如何進行上述公式的運算就要先講講橢圓曲線的加法。這里的加法與實數的加法不同。近世紀代數使得代數運算達到了高度的統一。數學家總結了普通加法的主要特征,提出了加群。在橢圓曲線上的加法法則:P + Q任意取橢圓曲線上兩點P、Q (若P、Q兩點重合,則做P點的切線)做直線交於橢圓曲線的另一點R’,過R’做y軸的平行線交於R。至於乘法n*p就相當於加了n次的p。

講完了公鑰,再來講講地址。用過比特幣交易的人應該會對地址有所了解。比特幣的地址通常以收款方出現。比特幣的地址可由公鑰經過單向的加密哈希算法得到。

A = RIPEMD160(SHA256(K))

公鑰K經過SHA256加密計算,再由RIPEMD計算得到160位的數字即為地址A。但是通常我們所說的地址是指經過Base58Check編碼的地址,在比特幣中,大多數需要向用戶展示的數據都使用Base58Check編碼,Base58就是由不包括(0,O,l,I)的大小寫字母和數字組成。比特幣中用Base58Check編碼,先在數據的頭部加上一個前綴來表明數據的類型,比如這數據是私鑰,公鑰還是地址。再在尾部加上校驗碼,來檢驗轉錄產生的錯誤。對之前的結果(前綴和數據)運行兩次SHA256哈希算法:

checksum =SHA256(SHA256(prefix+data))

在產生的長32個字節的哈希值(兩次哈希運算)中,我們只取前4個字節。這4個字節就作為校驗碼。校驗碼會添加到數據之后。結果由三部分組成:前綴、數據和校驗碼。這個結果采用之前描述的Base58字母表編碼,完整的私鑰轉成地址的過程可以用下圖來表示

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM