密碼學之Hash雜湊演算法
前言
在第一篇文章中已經有介紹區塊鏈技術概念,我們知道區塊鏈主要是由共識演算法機制、p2p網路、密碼學這幾個核心技術組成,前面幾篇文章講了共識演算法,p2p網路,這次我們談一下密碼學,密碼學是區塊鏈系統的基礎,如果沒有密碼學技術支撐,區塊鏈就僅僅是一個普通的分散式日誌系統。密碼學在區塊鏈上應用比較多的主要有兩種加密演算法: 一是雜湊雜湊演算法,二是非對稱加密演算法。比如在前面的第三章節中關於PoW 共識機制的實現原理也提到過,PoW 也是通過雜湊雜湊演算法去解決工作量證明難題。
什麼是Hash(雜湊演算法)
Hash,音譯“雜湊”,一般翻譯做“雜湊”,就是把任意長度的資料作為輸入,然後通過Hash雜湊演算法得到一個固定長度的輸出值,該輸出值就是雜湊值,它是一種資料壓縮對映關係。 簡單來說就是將做任意長度的訊息壓縮到某一固定長度的訊息摘要的函式。
例如:
簡單理解程式碼示例:
Hash雜湊演算法特徵
正向快速:給定明文和hash演算法,在有限時間和有限資源內計算Hash值。
不可逆性:給定任意的Hash值,在有限時間內很難逆推出明文。
輸入敏感:如果輸入的資料資訊被輕微修改,輸出的Hash值也會有很明顯的變化。
抗碰撞性:任意輸入不同的資料,其輸出的Hash值不可能相同,如果給定一個數據塊去找出其具有相同的Hash值,那是幾乎不可能。
Hash雜湊演算法實現原理
演算法實現可以有:加運算,位運算,乘運算,等。。。
它的最大特徵就是:將做任意長度的訊息壓縮到某一固定長度的值。
-
典型雜湊演算法函式
-
如何解決概率雜湊值生成0-15衝突
採用方法:Map連結串列
1. 建立一個長度為16的陣列,用於存放雜湊函式運算生成的0到15範圍的固定雜湊值。
//建立長度為16陣列,用於存放雜湊運算生成的 0〜15 範圍的固定雜湊值
const ARRAY_LEN int = 16
var buckets = make([]*LNode, ARRAY_LEN)
2. 建立一個連結串列結構,並實現連結串列增,刪,改,查等方法。
/** 存放資料元素結構 */ type KValue struct { Key string Value string } /** 節點結構 */ type LNode struct { Data KValue NextNode *LNode; }
3. 初始化陣列,每個陣列元素預設建立一個連結串列頭,通過連結串列來存放資料來解決雜湊運算中生成的0~15範圍的衝突問題,比如輸出兩個者是5的雜湊值時,這時候就把這兩個的資料存放到對應陣列元素為5的連結串列結構上。
func InitBuckets() {
for i:=0; i< ARRAY_LEN; i++ {
buckets[i] = CreateHeadNode(KValue{ "hash", strconv.Itoa(i)});
}
}
/*
建立頭結點
*/
func CreateHeadNode(data KValue) *LNode {
//fmt.Println("add new node ",data)
var pHeadNode = new(LNode)
pHeadNode.Data = data
pHeadNode.NextNode = nil
return pHeadNode
}
4. 新增新資料。
/**
新增使用者新值,供外部呼叫
*/
func AddKeyValue(key string, value string) {
//雜湊演算法生成 0~15 值
hashIndex := HashCode(key);
//獲取陣列對應的連結串列頭節點
var headNote = buckets[hashIndex]
//先找出尾節點以確保在尾結點上新增節點
var tailNode = TailNode(headNote)
//添置新結點
AddNewNode(KValue{key,value}, tailNode);
//顯示當前連結串列中所有節點
ShowAllNode(headNote)
}
Hash演算法區塊鏈上應用
-
應用於區塊的生成、驗證及交易的完整性
從區塊鏈的架構可以看出區塊鏈其實就是一個特定資料庫結構,由若干個有序的區塊通過相互間的雜湊(Hash)值連線在一起的連結串列結構。它也是一個典型的雜湊指標連結串列,每一個區塊的 prev_block_hash 都指向上一個區塊的雜湊,每個區塊資訊都可通過任意一個區塊雜湊去查詢,具有可塑性。如圖為區塊鏈結構。
-
PoW共識機制的實現,通過計算一個區塊的目標Hash雜湊值進行大量的窮舉運算。具體原理實現請翻讀之前發表的文章。
-
區塊中Merkle樹生成根結點的實現,通過對葉子節點從底層開始往上兩兩做SHA256 Hash,直到得出最頂部的節點Hash值作為本區塊樹的交易Hash,並將它存放在區塊鏈上。
-
錢包地址的生成,對公鑰進行兩次SHA256 Hash。
結語
本篇主要講了密碼學的其中一種加密演算法-Hash雜湊演算法,文章主要講了Hash雜湊演算法的概念、特徵、以及它的執行原理,另外也講了Hash演算法在區塊鏈上的一些應用。密碼學在區塊鏈系統中起著舉足輕重的作用,沒有密碼學技術的加入,那區塊鏈系統就變成是一個很普通的分散式日誌系統。
有興趣加入技術交流群的朋友,請先關注公眾號,然後通過公眾號傳送“加群”留言
▼長按2秒識別二維碼關注