天天看點

區塊鍊核心技術-密碼學

大家好,首先感謝騰訊雲提供雲社群這樣一個讓技術人員溝通交流的平台,其次很高興入駐到雲+社群認識到大家,我是騰訊雲TVP一員,專注于雲計算、區塊鍊、Web架構方向,myPagination作者,Github也開源了很多區塊鍊的項目:https://github.com/linapex,有需要的朋友可以下載下傳學習,本文是區塊鍊技術實戰系列的第二篇(不定期更新):

《區塊鍊從錢包應用到技術本質》

《區塊鍊核心技術-密碼學》

《區塊鍊核心技術-P2P網絡建構》

《區塊鍊核心技術-分布式一緻性與共識算法》

《區塊鍊核心技術-區塊設計與存儲》

今天我們聊一聊區塊鍊的核心技術密碼學,區塊鍊技術離不開密碼學,可以說密碼學是區塊鍊系統的基石之一,我們先來了解一下。

區塊鍊核心技術-密碼學

這是以太坊黃皮書關于錢包(私鑰、公鑰、位址)的描述,僅僅 2 行文字。主要講解私鑰通過 ECDSA(橢圓曲線簽名算法)推導出公鑰,繼而經過 Keccak 單向散列函數推導出位址。分解為 3 個步驟:

1. 建立随機私鑰 (64 位 16 進制字元 / 256 比特 / 32 位元組)

2. 從私鑰推導出公鑰 (128 位 16 進制字元 / 512 比特 / 64 位元組)

3. 從公鑰推導出位址 (40 位 16 進制字元 / 160 比特 / 20 位元組)

區塊鍊核心技術-密碼學

這是從ethereumjs/keythereum中剝離出來的 JavaScript 代碼,關于黃皮書上的公式的具體實作,僅僅 6 行代碼。

這是一件很奇妙的事情,2 行文字,6 行代碼承載着億萬級别的資産,但往往越簡單,越奧妙。以上的 6 行代碼,就已經囊括密碼學中大多數技術,比如随機數生成器、非對稱加密,單向散列函數等。

什麼是随機數生成器?

随機數用于生成私鑰,若随機數可以被預測或重制,則私鑰就會立刻形同虛設。是以保證随機數擁有下列三項特征,至關重要:

1.随機性:不存在統計學偏差,完全雜亂的數列

2.不可預測性:不能從過去的數列推測下一個出現的數

3.不可重制性:除非将數列儲存下來,否則不能重制相同的數列

軟體本身是無法生成具有不可重制性的随機數,因為運作軟體的計算機本身僅具備有限的内部狀态。是以通過确定性的代碼,在周期足夠長的情況下,必然會出現相同的随機數。是以要生成具備不可重制性的随機數,需要從不确定的實體現象中擷取資訊,比如周圍溫度、環境噪音、滑鼠移動,鍵盤輸入間隔等。

在 Linux 核心中維護了一個熵(shāng)池用來收集來自裝置驅動程式和其它來源的環境噪音。熵(entropy)是描述系統混亂無序程度的實體量,一個系統的熵越大則說明該系統的有序性越差,即不确定性越大。

是以在選擇生成私鑰的随機數方法時,需要選擇滿足密碼學強度的随機數方法,比如 Node 中的 crypto.randomBytes。當你調用 crypto.randomBytes(32) 方法時,它會等待熵池搜集足夠的資訊後,傳回 64 位的随機數,即私鑰。

const privateKey = crypto.randomBytes(32)
privateKey.toString('hex'): 
ea4692a11d962b249f8f0439d642a9013a1a08807649311d3672886d72d1fe51           

複制

區塊鍊核心技術-密碼學

什麼是非對稱加密?

在非對稱加密中,将密鑰分為加密密鑰和解密密鑰,也就是我們常說的公鑰和私鑰。公鑰和私鑰一一對應,由公鑰加密的密文,必須使用公鑰配對的私鑰才可以解密。

當我們調用 secp256k1.publicKeyCreate 獲得公鑰時,實際使用的是非對稱加密中的橢圓曲線算法。通過該算法可以從私鑰推導出公鑰,這是一個不可逆的過程:K = k * G。給出常數點 G 時,使用已知私鑰 k 求公鑰 K 的問題并不困難,但反過來,已知公鑰 K 求私鑰 k,則非常困難。這就是橢圓曲線算法上的離散對數問題,也是為什麼你可以分享位址(或公鑰)給别人,但不能暴露自己的私鑰。

const publicKey = secp256k1.publicKeyCreate(privateKey, false).slice(1) 
publicKey.toString('hex'):  
1e3f1532e3285b02...45d91a36a8d78cb6bef8           

複制

為了形象的表現橢圓曲線算法如何将私鑰推導出公鑰,我們将使用簡單的整數作為私鑰 k,找到公鑰 K = k * G,也就是 G 相加 k 次(數學原理一緻)。在橢圓曲線中, 點的相加等同于從該點畫切線找到與曲線相交的另⼀點, 然後映射到 x 軸。下圖展示了從曲線上獲得 G、2G、4G、8G 的幾何操作。

區塊鍊核心技術-密碼學

什麼是雜湊演算法?

密碼學技術,也稱散列函數,原理是把任意長度的輸入通過雜湊演算法,變換成固定長度的由字母和數字組成的輸出,如:錢包的位址、交易位址都是通過雜湊演算法運算出來的。

作為加密算法的一種,散列函數是一種單向密碼體制,對于給定的哈希值,無法推倒輸入的原始資料,具有不可逆性,這也是雜湊演算法安全性的重要基礎。

目前,雜湊演算法主要有兩類:MD系列和SHA系列。MD(Message Digest,消息摘要)系列包含MD4、MD5、HAVAL等,SHA(Secure Hash Algorithm,安全雜湊演算法)系列包含SHA1、SHA256等。其中MD5是密碼學專家R.L.Rivest設計,SHA是美國算法制定機構設計。

當我們調用 createKeccakHash("keccak256") 方法時,Keccak 使用海綿函數,對公鑰與初始的内部狀态做 XOR 運算得到 32 位元組散列值,取其後 20 位元組,轉成 40 位的 16 進制字元,即為位址。

const address = 
createKeccakHash("keccak256").update(publicKey).digest().slice(-20) 
address.toString("hex"): 
7a48ac1bf3943b2ca7a4ca4999cbcbb0e999950c            

複制

區塊鍊核心技術-密碼學

什麼是區塊鍊哈希?

在區塊鍊系統中,建構交易資料對應的Merkle樹,計算得到Merkle樹根節點的區塊鍊哈希值,區塊鍊的哈希值能夠唯一而精準地辨別一個區塊,區塊鍊中任意節點通過簡單的哈希計算都接獲得這個區塊的哈希值,計算出的哈希值沒有變化也就意味着區塊鍊中的資訊沒有被篡改。

Merkle樹在數字貨币、零知識證明、檔案完整性校驗等領域有廣泛的應用,如:比特币以太坊系統利用Merkle proofs來存儲每個區塊的交易,Git也是通過Merkle樹來進行完整性校驗。比特币簡化支付驗證SPV(Simplified Payment Verification)也是使用此方式進行驗證支付。

Merkle樹是Ralph Merkle于1979提出,是一種哈希二叉樹,在計算機科學中,二叉樹是每個節點最多有兩個子樹的樹結構,每個節點代表一條結構化資料。通常子樹被稱作“左子樹”(left subtree)和“右子樹”(right subtree)。二叉樹常被用于實作資料快速查詢,是散列清單和散列鍊的泛化。

區塊鍊核心技術-密碼學

線上體驗雜湊演算法:http://www.kjson.com/encrypt/hash/?fm=map

區塊鍊核心技術-密碼學