私鑰,公鑰和地址--精通比特幣(第二版)第四章精華

# 簡介

*比特幣的所有權是通過數(shù)字密鑰、比特幣地址和數(shù)字簽名來確定的。*

就好比銀行里面錢的所有權,要確認這筆錢屬于你,一般是需要你知道銀行賬戶(公鑰),自己的密碼(私鑰),以及一個簽名來確認的。在支付錢的時候,賣家給你的也是一個賬號,而非自己的密碼。稍微有點差別的是,在程序世界中,因為賬號,密碼是一一對應的,而數(shù)字簽名也是由有效的密鑰才能產(chǎn)生。*所以只需你知道私鑰,就可以擁有一筆比特幣的所權*。同樣其他人知道了你的私鑰,也可以輕易的拿著這筆比特幣。

# 私鑰和公鑰

*從私鑰到公鑰,再到公鑰到地址。這個推導流程都是單向的*。很難逆向推導。這是由于不對稱加密的方式導致的。什么是不對稱加密呢?就是往一個方向做計算很容易,但從另外一個方向反推就很困難。比如,做冪乘積相對簡單,但求對數(shù)就很難。

## 私鑰是如何產(chǎn)生的?

*比特幣私鑰是一個256位二進制數(shù)字*
可以通過各種能產(chǎn)生是或否的算法計算256次。比如拋256次硬幣。只要這個過程是*不可預測或不可重復*的,那么選取數(shù)字的具體方法并不重要。
比特幣軟件使用操作系統(tǒng)底層的隨機數(shù)生成器來產(chǎn)生256位的熵(隨機性)。通常情況下,操作系統(tǒng)隨機數(shù)生成器由人工的隨機源進行初始化,這就是為什么也可能需要不?;蝿邮髽藥酌腌?。

## 公鑰

* K=k\*G
其中k是私鑰,G是生成點,在該曲線上所得的點K是公鑰。因為所有比特幣用戶的生成點是相同的,一個私鑰k乘以G將 得到相同的公鑰K.


# 橢圓曲線加密

給定橢圓曲線上的點P,如果k是整數(shù),則 kP = P + P + P + …+ P(k次)

給定橢圓曲線上的兩個點P1和P2,則橢圓曲線上必定有第三點 P3 = P1 + P2。幾何圖形中,該第三點P3可以在P1和P2之間畫一條線來確定。這條直線恰好與橢圓曲線相交于另外一個地方。此點記為 P3’= (x,y)。然后,在x軸做翻折獲得 P3=(x,-y)。為了處理一些特殊點,比如A(x,y),B (x,-y)所組成的線與曲線相交的情況(曲線與x軸垂直),需要引入無線電Aoo。這個點與其他個點相加,所得到的結(jié)構(gòu)仍為其他點。A(x,y)+B (x,-y)=Aoo,

由于實數(shù)范圍很大,很難應用于實際的加密中。為了便于應用,在實際運用中,還將使用范圍控制在質(zhì)數(shù)P個。這樣能形成的集合能夠滿足一定的數(shù)學要求。例如互換, 除法等。在*限定在一個素數(shù)范圍后,曲線就不再是一個連續(xù)的曲線,而是一些離散的點*。比如素數(shù)階17的有限域內(nèi)的橢圓曲線。

## 為什么橢圓曲線加密能夠單向加密?

公鑰加密使用的是橢圓曲線加密法。*其特性導致了做乘法容易,除法難*。該曲線加密的特點在于:你拿球從A射向B.當它撞上曲線,這個球向上反彈或者向下反彈到X軸的另外一側(cè)。以這個規(guī)則,若有個人知道了要加的次數(shù)和起始點,他可以很容易得知終點在什么地方。但反過來就很復雜,你只知道初始末尾兩個點是很難知道這個推導是經(jīng)過了多少步,那異常艱難。
另外,相比于其他加密方式,橢圓曲線加密可以要求數(shù)據(jù)長度更短,這樣對存儲的要求更低。

## 如何簡單理解橢圓曲線加密呢?

知乎上Chizhong Jin有段很生動的描述:(鏈接:https://www.zhihu.com/question/22399196/answer/308626466)
有一天張三挑出了兩個數(shù)字,123,456。由于張三會乘法,于是乎張三計算出了:
123 \*456 = 56088 于是張三告訴你:123\*??? = 56088
你是個天資卓絕的人,但是沒辦法,上天不允許你會除法 (乘法大家都會,但除法大家都不會),因此你沒法知道張三說的???是什么。
有一天,你打算告訴張三一個秘密,67。但是你又不想別人知道。于是聰明絕頂?shù)哪汶S手選了一個數(shù)字222。計算出:
123\*222 = 27306? 56088\*222 + 67 = 12451603
然后你對張三說:
123\*??? = 27306
56088\*??? + x = 12451603
當然,你聰明絕頂,張三聰明禿頂,于是張三一尋思:
123\*???\*456 = 56088\*???
這上下一減,x = 12451603 - 27306\*456 = 67
哎媽呀,這x就這么被傳遞過來了。
如果我們把上面的過程寫成數(shù)學公式的話,就是
G\*k = K (G,K公開,k保密)
c1 = G\*M
c2 = K\*M + x (M隨機選取,x為要加密的數(shù)字,M和x都保密)
x = c2 - c1\*k
= K\*M + x - G\*M\*k
= G\*M\*k + x - G\*M\*k (消除左右兩側(cè)的G\*M\*k)
= x

# 公鑰私鑰的格式

## 公鑰的格式

公鑰是在橢圓曲線上的一個點,由一對坐標(x,y)組成。公鑰通常表示為前綴04緊接著兩個256比特的數(shù)字 ( 130個十六進制數(shù)字)。其中一個256比特數(shù)字是公鑰的x坐標,另一個256比特數(shù)字是y坐標。
如 K = 04F028892BAD7ED57D2FB57BF33081D5CFCF6F9ED3D3D7F159C2E2FFF579DC341A07CF33DA18BD734C600B96A72BBC4749D5141C90EC8AC328AE
52DDFE2E505BDB

壓縮公鑰:由于Y其實是X的一個函數(shù),在知道了X后可以輕易推導出Y。所以為了節(jié)省儲存數(shù)量,就可以只記錄X的數(shù)據(jù)即可。這樣可以節(jié)省256個比特。但由于在曲線函數(shù)中Y是以平方的形式出現(xiàn)的,所以會出現(xiàn)正負兩個解。為了對這個進行區(qū)別,在前導字符用不同的數(shù)字指明正負的形式。

*未壓縮格式公鑰使用04作為前綴。我們在生成壓縮格式公鑰時,如果y是偶數(shù),則使用02作為前綴;如果y是奇數(shù),則使用03作為前綴*

## 私鑰的格式

*壓縮的私鑰”實際上只是表示“用于生成壓縮格式公鑰的私鑰”*。壓縮的私鑰比非壓縮的私鑰多了一個字節(jié) (十六進制為01)。這是為了告訴錢包,這個私鑰已經(jīng)被用于生成壓縮公鑰以及地址了。雖然Base58編碼版本前綴對于WIF和WIF壓縮格式都是相同的(0x80),但在數(shù)字末尾添加一個字節(jié)會導致Base58編碼的第一個字符從5變?yōu)镵或 L

# 比特幣地址

## 比特幣地址為什么長度不同?

由于6位二進制代碼有可能出現(xiàn)大于58的情況,所以在Base58中在進行編譯時,可能出現(xiàn)按照*6位二進制切分編譯也可能出現(xiàn)按照5位二進制切分編譯*的情況。所以可能會出現(xiàn)不同長度的“Base58Check”編碼的地址。

## 比特幣地址為什么開頭字母不一樣?

# 其他一些應用:

1:加密私鑰。
BIP0038加密方案是(BIP:比特幣優(yōu)化建議):輸入一個比特幣私鑰,通常使用WIF編碼過,base58chek字符串的前綴“5”。此外BIP0038加密方案需要一個長密碼作為口令,通常由多個單詞或一段復雜的數(shù)字字母字符串組成。BIP0038加密方案的結(jié)果是一個由base58check編碼過的加密私鑰,前綴為6P。
在使用時需要將這個加密秘鑰進行口令解密后才能看見實際的秘鑰。相當于多了一層保證。

2:P2SH (Pay-to-Script Hash)和多重簽名地址
以數(shù)字3開頭的比特幣地址是P2SH地址,有時被錯誤的稱謂多重簽名或多重簽名地址。他們指定比特幣交易中受益人為哈希的腳本,而不是公鑰的所有者。資金被發(fā)送到3開頭的地址時,需要的不僅僅是一個公鑰的哈希值和一個私鑰簽名作為所有者證明。在創(chuàng)建地址的時候,這些要求會被指定在腳本中。這就為多重簽名創(chuàng)造了條件。比如需要同時3個人簽名才能取款等。

3:比特幣靚號
可以讓比特幣地址前面一些字符具有一定的意義,比如“1kidsXXXXXXXX”。這樣顯得更獨特。但每增加一個字符,難度會增加58倍。

4:紙錢包
將秘鑰保存在紙或者其他媒介上的錢包。

***內(nèi)容參考或出自:***

精通比特幣 第二版 中文 Andreas M. Antonopoulos作,喬延宏等翻譯,http://book.8btc.com/books/6/masterbitcoin2cn/_book/trans-preface.html

一個關于橢圓曲線密碼學的初級讀本(相當容易懂) http://8btc.com/thread-1240-1-1.html
知乎 誰能最簡單的詳解橢圓曲線算法,secp256k1 是如何生成公鑰和私鑰的? https://www.zhihu.com/question/22399196
談談有限域那些事兒 https://blog.csdn.net/qmickecs/article/details/77281602
為什么比特幣地址以1開頭 http://8btc.com/thread-14607-1-1.html

?

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • 今天我們進入《精通比特幣》第三章,比特幣實現(xiàn)參考,以及第四章的第一部分。第四章比較長,所以大家要有耐心,因為真正的...
    Scalers閱讀 719評論 0 1
  • “關于公鑰加密那點事” 據(jù)說20世界70年代,公鑰加密這貨被發(fā)明了,成計算機和信息安...
    loloooo閱讀 1,201評論 0 5
  • 在比特幣中,經(jīng)常出現(xiàn)三個詞:私鑰,公鑰和地址。他們是什么意思呢?他們之間又有什么樣的關系呢?搞清楚他們之間的關系和...
    0xSen閱讀 45,954評論 3 48
  • (一)夢境 東晉太元八年元月,我仿佛做了一個夢。夢里我到了一個恐怖陌生的地方,那里面沸湯如海烈火成洲,滿眼都是被牛...
    糖糖阿錦閱讀 343評論 0 2
  • 4月22日,就是東莞培訓師俱樂部三大品牌之一(練兵營,點將臺,百師薈)練兵營活動在善木文化如期進行 1、有趣 第一...
    敬天_愛人閱讀 438評論 0 1

友情鏈接更多精彩內(nèi)容