密碼學之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秒識別二維碼關注

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章