比特幣紙錢包、腦錢包?原諒我腦內存不足(二)點擊上方“BitMart” 可以訂閱哦!

此文爲技術狗出品,新手小白請自覺搬好小板凳!

開場白

上一章給大家介紹了比特幣是什麼、比特幣錢包種類以及各個比特幣錢包如何操作,但想要深入瞭解比特幣的原理,需要掌握到很多密碼學知識,例如公鑰、私鑰、哈希、對稱加密、非對稱加密、數字簽名等。

本章將從密碼學的角度帶大家瞭解更多比特幣的知識!

比特幣紙錢包、腦錢包?原諒我腦內存不足(二)

01 比特幣基本概念

比特幣紙錢包、腦錢包?原諒我腦內存不足(二)

區塊鏈:一種去中心化的分佈式賬本,由一個個區塊(block)組成。區塊很像數據庫的記錄,每次寫入,就創建了一個新的區塊,寫入後幾乎無法更改。

公有鏈,任何人都可以參與使用和維護,信息公開,如比特幣,以太坊等。

聯盟鏈,若干組織共同維護,有權限限制,信息受保護,如超級賬本 Fabric。

私有鏈,被少數人管理控制,信息不公開。

區塊:區塊是一種被包含在公開賬簿(區塊鏈) 裏的聚合了交易信息的容器數據結構。它由一個包含元數據的區塊頭和緊跟其後的構成區塊主體的一長串交易組成。

區塊頭:版本號,父區塊哈希,Merkle 樹根,時間戳,難度值,nonce 計數器。

區塊體:包含一個或者多個交易的集合。

交易:coinbase 交易是挖礦獎勵所得,其他交易爲轉移比特幣資產。

地址:接收發送比特幣的的唯一標示,長度爲 34 的字符串,主網中以 1 開頭,例 1CS8g7nwaxPPprb4vqcTVdLCuCRirsbsMb,測試網中以 m 或 n 開頭。

公鑰:公鑰是從私鑰通過橢圓曲線運算計算得來的,這個過程是不可逆的。也就是說通過私鑰可以算出公鑰,反之則不行。

私鑰:私鑰就是一個 256 位的隨機數,取值處於 1 到 n – 1 之間,其中:n =2^256= 1.158 * 10^77;例如使用 SHA256 算法,就能很方便的生成 256 位隨機數。

錢包文件:通常所說的錢包文件是 wallet.dat,存儲了一批比特幣地址和其歷史交易信息,可以設置加密密碼。

錢包密碼:給錢包設置的密碼和錢包的私鑰不是同一個概念,錢包的密碼相當於給你錢包上的所有私鑰進行二次加密,如果設置了錢包密碼,即便拿到存儲私鑰的 wallet.dat 文件,也無法查看文件裏面私鑰的信息。

比特幣 wallet.dat 和密碼等價於比特幣私鑰。

02 密碼學基礎

2.2.1 對稱加密

對稱加密的加密密鑰和解密鑰相同,A 選擇某一種加密規則,對信息進行加密;B 使用同一種規則,對信息進行解密。由於加密和解密使用同樣的規則(簡稱“密鑰”),這種加密方式被稱爲對稱加密算法。

這種加密模式有一個最大缺點:甲方必須把加密規則告訴乙方,否則無法解密,這樣在傳輸過程中無法確保密鑰被安全傳送,容易被竊取。

常用算法:DES、3DES (TripleDES)、AES 等。

使用場景:網站 API 接口的數據傳輸。

2.2.2 非對稱加密

非對稱加密(公鑰加密)發明於 20 世紀 70 年代。它是計算機和信息安全的數學基礎。自從公鑰加密被髮明之後,一些合適的數學函數被提出,如:素數冪和橢圓曲線乘法。這些數學函數都是不可逆的,就是說很容易向一個方向計算, 但不可以向相反方向倒推。基於這些數學函數的密碼學, 使得生成數字密鑰和不可僞造的數字簽名成爲可能。

加密過程

(1) B 生成一對密鑰(公鑰和私鑰),公鑰是公開的,可以發送給與他通信的任何人,私鑰則是保密的,不能傳送出去;

(2) A 獲得 B 的公鑰,使用 B 的公鑰對信息進行加密,然後將加密信息傳送給 B;

(3) B 得到加密後的信息,用私鑰進行解密。

在這個過程中,公鑰加密的信息只有私鑰解得開,那麼只要私鑰不泄漏,雙方的通信就是安全的。

公鑰加密,私鑰解密;公鑰由私鑰生成,私鑰可以推導出公鑰,從公鑰無法推導出私鑰。

常用算法:RSA、ECC (橢圓曲線加密算法)

使用場景:SSH 安全驗證。

http://www.ruanyifeng.com/blog/2013/06/rsa_algorithm_part_one.html

http://www.ruanyifeng.com/blog/2013/07/rsa_algorithm_part_two.html

2.2.3 哈希算法

Hash,直接音譯爲哈希,也有譯做散列。就是把任意長度的輸入,通過一定的算法,變換成固定長度的輸出,該輸出就是哈希值。

簡單的說就是一種將任意長度的消息壓縮到一固定長度的消息摘要的函數。

不可逆性:幾乎無法通過哈希的結果推導出原文。

無碰撞性:兩個不同原文哈希後的結果一定不同。

常用算法:MD5、SHA-256、SHA-512、RIPEMD-160

使用場景:用戶密碼存儲(MD5),比特幣挖礦(SHA256)

03 比特幣私鑰和公鑰

比特幣紙錢包、腦錢包?原諒我腦內存不足(二)

2.3.1 生成私鑰

私鑰就是一個 256 比特的隨機數。一個比特幣地址中的所有資金的控制取決於相應私鑰的所有權和控制權。在比特幣交易中,私鑰用於生成支付比特幣所必需的簽名以證明資金的所有權。私鑰還必須進行備份,以防意外丟失,因爲私鑰一旦丟失就難以復原,其所保護的比特幣也將永遠丟失。

私鑰的格式:私鑰可以有許多不同的格式表示, 所有這些都對應於相同的 256 比特的數字。私鑰的三種常見格式如下。

比特幣紙錢包、腦錢包?原諒我腦內存不足(二)

Base58 編碼

Base64 使用了 26 個小寫字母、26 個大寫字母、10 個數字以及兩個符號(例如“+”和“/”),用於在電子郵件這樣的基於文本的媒介中傳輸二進制數據。Base64 通常用於編碼郵件中的附件。Base58 是一種基於文本的二進制編碼格式,用在比特幣和其它的加密貨幣中。這種編碼格式不僅實現了數據壓縮,保持了易讀性,還具有錯誤診斷功能。Base58 是 Base64 編碼格式的子集,同樣使用大小寫字母和 10 個數字,但捨棄了一些容易錯讀和在特定字體中容易混淆的字符。具體地,Base58 不含 Base64 中的 0 (數字 0)、O (大寫字母 o)、l (小寫字母 L)、I (大寫字母 i),以及“+”和“/”兩個字符。簡而言之,Base58 就是由不包括(0,O,l, I)的大小寫字母和數字組成。

簡單來說就是把編碼後的文本數字串,轉換成一個大整數,然後再按 58 進製表示出來。

Base58Check 編碼

一種常用在比特幣中的 Base58 編碼格式, 增加了錯誤校驗碼來檢查數據在轉錄中出現的錯誤。校驗碼長 4 個字節, 添加到需要編碼的數據之後。校驗碼是從需要編碼的數據的哈希值中得到的, 所以可以用來檢測並避免轉錄和輸入中產生的錯誤。

爲了使用 Base58Check 編碼格式對數據(數字) 進行編碼,首先我們要對數據添加一個稱作“版本字節”的前綴,這個前綴用來明確需要編碼的數據類型。例如,比特幣地址的前綴是 0 (十六進制 00),私鑰編碼時前綴是 128 (十六進制 80)。

“雙哈希”校驗碼,對前綴和數據運行兩次 SHA256 哈希算法:checksum= SHA256(SHA256(prefix+data)),在產生的 32 個字節的哈希值中,取前 4 個字節作爲校驗碼,添加到數據之後。對生成的結果(前綴、 數據和校驗碼)進行 Base58 編碼。

比特幣紙錢包、腦錢包?原諒我腦內存不足(二)

Bitcoin Explorer 命令行工具

比特幣紙錢包、腦錢包?原諒我腦內存不足(二)

Hex 形式私鑰

64 位 16 進制串,長度爲 32 字節,可以從 256 比特的二進制字符串轉換而來。

比特幣紙錢包、腦錢包?原諒我腦內存不足(二)

WIF 形式私鑰

在 64 位 16 進制串對應的字節串前加上前綴 0x80,並用 Base58Check 編碼。

比特幣紙錢包、腦錢包?原諒我腦內存不足(二)

WIF compressed 形式私鑰

WIF-compressed 就是在 64 位 16 進制串對應的字節串前加上前綴 0x80,並加上後綴 0x01,並用 Base58Check 編碼。

比特幣紙錢包、腦錢包?原諒我腦內存不足(二)

2.3.2 生成公鑰

私鑰經過 SECP256K1 的算法處理,可以生成了公鑰。SECP256K1 是一種橢圓曲線算法,通過一個已知的私鑰,可以算得對應的公鑰, 這是不可逆轉的過程。但是,知道某一公鑰,卻無法反向計算出私鑰。

橢圓曲線加密算法是一種基於離散對數問題的非對稱(或公鑰) 加密法, 可以用對橢圓曲線上的點進行加法或乘法運算來表達。

公鑰也可以用多種不同格式來表示, 最重要的是它們分爲非壓縮格式或壓縮格式公鑰這兩種形式。

公鑰是在橢圓曲線上的一個點,由一對座標(x,y)組成。公鑰通常表示爲前綴 04 緊接着兩個 256 比特的數字。其中一個 256 比特數字是公鑰的 x 座標, 另一個 256 比特數字是 y 座標。非壓縮格式公鑰前綴是 04,壓縮格式公鑰前綴是 02 或者 03。

非壓縮格式公鑰

比特幣紙錢包、腦錢包?原諒我腦內存不足(二)

前綴:04

x 座標:

98c39ac0d91ff4cea6e79ae5836e50868c47191bca0fbfd2a6838d303665f506

y 座標:

ad0a9ccb60c7758ce4c2759b8f7b0f731f0d8d90caf3778c4a65a0c53cf94210

非壓縮格式公鑰一共是 520 bits (8 + 256 + 256),使用 16 進制字符串表示,要 130 個字節 !

壓縮格式公鑰

引入壓縮格式公鑰是爲了減少比特幣交易的字節數,從而可以節省那些運行區塊鏈數據庫的節點磁盤空間。大部分比特幣交易包含了公鑰, 用於驗證用戶的憑據和支付比特幣。每個公鑰有 520 比特(包括前綴,x 座標,y 座標)。如果每個區塊有數百個交易, 每天有成千上萬的交易發生, 區塊鏈裏就會被寫入大量的數據。

公鑰是橢圓曲線上的一個點 P(x, y),而按照橢圓曲線的方程,我們是可以通過 x 求得 y 的,所以我們只要保留 x 部分就可以了。公鑰壓縮的實現,若 y 是偶數,前綴爲 02,y 是奇數,前綴爲 03,接上 x 的 16 進制字符串即可。

比特幣紙錢包、腦錢包?原諒我腦內存不足(二)

04 比特幣地址

比特幣地址是一個由數字和字母組成的字符串,可以發送給任何想給你比特幣的人。由公鑰(一個同樣由數字和字母組成的字符串)生成的比特幣地址以數字 1 開頭。

公鑰到公鑰哈希的流程:

比特幣紙錢包、腦錢包?原諒我腦內存不足(二)

公鑰哈希到比特幣地址的流程:

比特幣紙錢包、腦錢包?原諒我腦內存不足(二)

非壓縮格式公鑰生成比特幣地址的流程:

比特幣紙錢包、腦錢包?原諒我腦內存不足(二)

比特幣紙錢包、腦錢包?原諒我腦內存不足(二)

比特幣紙錢包、腦錢包?原諒我腦內存不足(二)關於 BitMart

BitMart 是由衆多華爾街精英人士打造的全球化綜合交易平臺,目前排名全球權威加密貨幣追蹤網站 CoinMarketCap (CMC) 前 5。BitMart 旨在提供幣幣交易、期貨合約、融資融幣、場外交易、全網交易,去中心化交易等多樣化的系統功能,滿足各類投資者的交易需求。BitMart 目前擁有 262 個交易對,4 個交易區(BTC, ETH, USDT 和 BMX),市場規模覆蓋 180 多個國家。

比特幣紙錢包、腦錢包?原諒我腦內存不足(二)

比特幣紙錢包、腦錢包?原諒我腦內存不足(二)