比特幣背後的密碼學原理(連載二)

買賣虛擬貨幣

目錄:

           序言

一.      密碼學理論

二.      比特幣實戰

三.      區塊鏈

四.      挖礦原理

五.      總結

比特幣背後的密碼學原理(連載一)

二、比特幣實踐


從現在開始,我們開始真刀實槍了,先看看比特幣的編碼世界。


1.Base58和Base58Check編碼


這裡請允許我拿來主義,我覺得王秒等多位老師翻譯的Andreas M. Antonopoulos所著《精通比特幣》對這個問題已經解釋的很清楚了,更詳細的描述還可以看看這裡。

為了更簡潔方便地表示長串的數字,許多計算機系統會使用一種以數字和字母組成的大於十進位制的表示法。例如,傳統的十進位制計數系統使用0-9十個數字,而十六進位制系統使用了額外的 A-F 六個字母。一個同樣的數字,它的十六進位制表示就會比十進位制表示更短。更進一步,Base64使用了26個小寫字母、26個大寫字母、10個數字以及兩個符號(例如“+”和“/”),用於在電子郵件這樣的基於文字的媒介中傳輸二進位制資料。Base64通常用於編碼郵件中的附件。Base58是一種基於文字的二進位制編碼格式,用在比特幣和其它的加密貨幣中。這種編碼格式不僅實現了資料壓縮,保持了易讀性,還具有錯誤診斷功能。Base58是Base64編碼格式的子集,同樣使用大小寫字母和10個數字,但捨棄了一些容易錯讀和在特定字型中容易混淆的字元。具體地,Base58不含Base64中的0(數字0)、O(大寫字母o)、l(小寫字母L)、I(大寫字母i),以及“+”和“/”兩個字元。簡而言之,Base58就是由不包括(0,O,l,I)的大小寫字母和數字組成。

需要注意的是,Base58編碼是不含校驗資訊的,Base58Check是一種常用在比特幣中的Base58編碼格式,增加了錯誤校驗碼來檢查資料在轉錄中出現的錯誤。校驗碼長4個位元組,新增到需要編碼的資料之後。

為了使用Base58Check編碼格式對資料(數字)進行編碼,首先我們要對資料新增一個稱作“版本位元組”的字首,這個字首用來明確需要編碼的資料的型別。例如,比特幣地址的字首是0(十六進位制是0x00),而對私鑰編碼時字首是128(十六進位制是0x80)。 表4-1會列出一些常見版本的字首。

接下來,我們計算“雙雜湊”校驗碼,意味著要對之前的結果(字首和資料)執行兩次SHA256雜湊演算法:

checksum = SHA256(SHA256(prefix+data))

在產生的長32個位元組的雜湊值(兩次雜湊運算)中,我們只取前4個位元組。這4個位元組就作為校驗碼。校驗碼會新增到資料之後。結果由三部分組成:字首、資料和校驗碼。


2.金鑰、地址與錢包


先說結論:


1.金鑰通常指的是保護比特幣資產的對應於所有權使用者的私鑰,個別時候也會模糊的統稱私鑰和公鑰為金鑰,這裡我們以狹義的私鑰解釋為準。

2.地址大部分情況下是指對公鑰的封裝(個別時候除了公鑰還有指令碼)。

3.錢包是私鑰的容器,通常透過有序檔案或者簡單的資料庫實現。比特幣錢包包含私鑰和公鑰資料,儘管公鑰資料理論是是不需要儲存的。

2.1私鑰保護


私鑰必須保密。私鑰的機密性需求事實情況是,在實踐中相當難以實現,因為該需求與同樣重要的安全物件可用性相互矛盾。當你需要為了避免私鑰丟失而儲存備份時,會發現維護私鑰私密性是一件相當困難的事情。透過密碼加密內有私鑰的錢包可能要安全一點,但那個錢包也需要備份。有時,例如使用者因為要升級或重灌錢包軟體,而需要把金鑰從一個錢包轉移到另一個。私鑰備份也可能需要儲存在紙張上(參見“4.5.4 紙錢包”一節)或者外部儲存介質裡,比如隨身碟。但如果一旦備份檔案失竊或丟失呢?這些矛盾的安全目標推進了便攜、方便、可以被眾多不同錢包和比特幣客戶端理解的加密私鑰標準BIP0038的出臺。

BIP0038提出了一個通用標準,使用一個口令加密私鑰並使用Base58Check對加密的私鑰進行編碼,這樣加密的私鑰就可以安全地儲存在備份介質裡,安全地在錢包間傳輸,保持金鑰在任何可能被暴露情況下的安全性。這個加密標準使用了AES,這個標準由NIST建立,並廣泛應用於商業和軍事應用的資料加密。

2.2公鑰與地址


我們知道比特幣協議的區塊鏈實際上是對交易的維護而不是對賬戶的維護,交易資料本身並不需要私鑰,因此對公鑰的封裝也就是地址就顯得格外重要,需要兼顧安全,效率和擴充套件。

從公鑰到地址經歷瞭如下過程:

A = RIPEMD160(SHA256(K))

公式中,K是公鑰,A是生成的比特幣地址。比特幣地址與公鑰不同。比特幣地址是由公鑰經過單向的雜湊函式生成的

以公鑰 K 為輸入,計算其SHA256雜湊值,並以此結果計算RIPEMD160 雜湊值,得到一個長度為160位元(20位元組)的數字後進行Base58Check編碼即可得到比特幣地址。從編碼資料結構的視角看,是下圖:

需要注意的是,從地址已經無法反推公鑰資訊,因此,需要將私鑰以及對應的公鑰、地址一起儲存。


2.3比特幣錢包


比特幣錢包要解決的核心問題是私鑰管理,早期的方式是隨機生成私鑰池並一次一密,這當然是安全性很高的方案。但是對儲存,匯入匯出備份帶來了極大的挑戰,畢竟私鑰丟了誰也沒有辦法。改進的私鑰管理辦法將私鑰鏈式管理起來了,見下圖:

生成鏈式結構的過程如下:

未完待續......

作者簡介:

 怒馬,數字貨幣愛好者,正經大學畢業,愛技術,持續好奇心擁有者。

免責聲明:

  1. 本文版權歸原作者所有,僅代表作者本人觀點,不代表鏈報觀點或立場。
  2. 如發現文章、圖片等侵權行爲,侵權責任將由作者本人承擔。
  3. 鏈報僅提供相關項目信息,不構成任何投資建議

推荐阅读

;