什麼是密碼學?
密碼術是開發防止第三方查看私人數據的協議的做法。現代密碼學結合了數學,計算機科學,物理,工程等學科。一些重要的術語定義如下:
- 加密:將文本編碼為不可讀的格式。
- 解密:保留加密 – 將混亂的消息轉換為其原始形式。
- 密碼:用於執行加密或解密的演算法,通常是可以遵循的明確定義的一組步驟。
現代之前的密碼學是加密的同義詞 – 將信息從可讀格式轉換為無意義的東西的過程。加密技術可以追溯到古埃及人,並且歷史悠久。
例如,Caesar Cipher是Julius Caesar用來與他的將軍安全溝通的著名密碼。密碼將消息中的每個字母「移動」一定量 – 移位為2,A將變為C,B將變為D,依此類推。
區塊鏈技術以多種不同的方式使用密碼術 – 用於錢包,交易,安全和隱私保護協議。本文將介紹與區塊鏈技術相關的一些重要加密主題,包括公鑰加密,散列和Merkle樹。
公鑰加密
公鑰加密(也稱為非對稱加密)是一種使用一對密鑰的加密系統 – 公鑰和私鑰。公鑰可以廣泛分發,但私鑰僅由其所有者知道。密鑰始終成對創建 – 每個公鑰必須具有相應的私鑰。
公鑰加密最常用於以安全的方式加密兩個人或兩台計算機之間的消息。任何人都可以使用某人的公鑰來加密消息,但一旦加密,解密該消息的唯一方法就是使用相應的私鑰。
假設Alice想要向Bob發送加密消息。它會像這樣工作:
- Alice使用Bob的公鑰來加密消息。
- Alice將加密的消息發送給Bob–如果第三方攔截了它,他們所看到的只是隨機數字和字母。
- Bob使用他的私鑰來解密和閱讀消息。
說明此過程的圖表如下所示:
資料來源:韋爾斯利學院
公鑰加密是區塊鏈技術的基本要素 – 它是錢包和交易的基礎技術。當用戶在區塊鏈上創建錢包時,他們正在生成公鑰 – 私鑰對。
該錢包的地址,或者它在區塊鏈中的表示方式,是由公鑰生成的一串數字和字母。由於區塊鏈技術的性質,這個地址對每個人都是公開的,可用於檢查錢包中的餘額或向其發送硬幣。
與錢包相關聯的私鑰是如何證明所有權和控制錢包。這是從中發送硬幣的唯一方法,丟失的私鑰意味著裡面的硬幣將永遠卡在那裡。
區塊鏈上的交易只不過是一條廣播信息,主要是說:「從我的錢包中取出X幣並將X幣存入另一個錢包」。確認後,交易將不可變地寫入分類帳,並更新餘額。
但是,此交易消息要求來自發送錢包的私鑰的簽名有效。廣播後,任何人都可以使用該錢包的公鑰來確保來自私鑰的數字簽名是真實的。這是塊驗證器在將任何事務(即消息)添加到區塊鏈之前的一個角色。
密碼哈希
加密散列是區塊鏈技術的另一個基本要素,它直接負責產生不可變性 – 區塊鏈最重要的特徵之一。
哈希是一個計算機科學術語,意味著獲取任意長度的輸入字元串併產生固定長度的輸出。如果某個散列函數的輸入是3或100個字元無關緊要,則輸出的長度始終相同。
加密哈希函數*是具有以下關鍵屬性的哈希函數:
- 確定性:無論你為函數提供多少次特定輸入,它都將始終具有相同的輸出。
- 不可逆:無法確定函數輸出的輸入。
- 碰撞阻力:沒有兩個輸入可以具有相同的輸出。
加密散列函數的另一個重要特性是改變輸入中的任何數據位都會大大改變輸出。例如,111111和111112的散列輸出將是完全唯一的並且彼此無關。
密碼散列函數最常用的用例是密碼存儲。大多數網站都不存儲你的原始密碼 – 它們存儲你的密碼哈希值,並在你在給定的站點訪問時輸入密碼時檢查哈希是否匹配。如果黑客入侵他們的資料庫,他們只能訪問不可逆轉的密碼哈希值。
那麼,加密哈希如何為區塊鏈技術提供不變性?答案是每個新的數據塊都包含前一個塊中所有數據的哈希輸出。
想像一下剛剛添加了第1000塊的區塊鏈。來自塊999的數據在塊1000中作為散列函數輸出存在。然而,包括在塊999中的數據是塊998的數據的散列,其包含塊997的數據的散列。
通過向後遍歷散列,從1000到1的每個塊都通過加密散列鏈接。該架構的圖表如下所示:
資料來源: Block Geeks
這最終是使區塊鏈中的數據不可變的原因。如果有人試圖在任何過去的塊中僅更改1位數據,那麼它不僅會改變該塊數據的哈希輸出,而且會改變其後的每個塊。網路上的礦工和節點會立即注意到所產生的散列與其鏈的版本不匹配並拒絕更改。
*作為參考,比特幣使用稱為SHA-256的加密哈希函數,而以太坊使用keccak256。
Merkle樹
上圖是區塊鏈的簡化版本,省略了一些重要信息。它有一個箭頭,表明每個塊的事務都存儲在Merkle根中,Merkle根是Merkle樹的根節點。
對於上下文,樹是用於以分層樹狀結構存儲數據的計算機科學術語,其中數據位被稱為節點。有一個根(頂部)節點,其下面鏈接有「子」節點,它們本身有子節點,依此類推。說明典型樹數據結構的圖如下所示:
來源: 教程點
如圖所示,樹中的節點組稱為子樹,沒有子節點的節點(其下沒有數據)稱為葉節點。
Merkle樹(或哈希樹)是利用加密散列函數來存儲散列輸出而不是每個節點中的原始數據的樹。每個葉節點由其原始數據的加密散列組成,並且每個父節點是其子節點散列的組合的散列。
Merkle根只是Merkle樹的根(頂部)節點,這意味著它代表左右子樹的組合哈希的哈希輸出。具有4個葉節點的Merkle樹的圖如下所示:
資料來源:Shaan Ray
每個葉節點表示事務A,B,C和D的數據的散列。然後將散列A和散列B組合併散列以產生散列AB,並且以相同的方式產生散列CD。最後,散列AB和散列CD被組合併散列以形成樹的Merkle根。
那麼為什麼Merkle樹對區塊鏈技術很重要呢?
使用Merkle根並應用加密散列函數的屬性,可以快速判斷給定塊中的事務是否已被篡改以及特定事務是否被篡改。
如果確認塊中的單個事務被更改,則Merkle根將最終與「正確」Merkle根完全不同,並且篡改將是顯而易見的。
Merkle樹還允許用戶驗證他們的事務已被包含在塊中而無需下載整個區塊鏈。諸如簡化支付驗證之類的流程能夠遍歷Merkle樹中的分支,並檢查某個事務是否已經散列到該樹中。如果不在每個區塊中包含Merkle根,則區塊鏈技術的這種效率水平是不可能的。
區塊鏈中4個事務的Merkle樹示例如下所示(在此圖中,Tx_Root是Merkle根):
資料來源:Block Geeks
結論
密碼學是區塊鏈技術內部工作的一個組成部分。公鑰加密作為區塊鏈錢包和交易的基礎,加密哈希函數提供不變性的特徵,Merkle樹組織交易,同時使區塊鏈更有效。