生日悖論和區塊鏈
Ⅰ 區塊鏈:防篡改的哈希加密演算法
同學A和B在教室里拋硬幣,賭誰打掃衛生,正面朝上,則A打掃,反面朝上,則B打掃,這個策略沒有什麼問題。
然而,如果把情景遷移到網路聊天室,A和B同樣進行拋硬幣的游戲,估計B就不會答應了,因為當A拋了硬幣,B不論是猜
正面還是反面,A都可以說B猜錯了。
怎麼解決這個問題呢?要不先給拋硬幣的結果加密,B再猜?這個方法可以試一下。
假設任意奇數代表硬幣正面,任意偶數代表反面。A想一個數375,然後乘以一個258,把其結果告訴B為96750,並聲明A想的375為密鑰,由他保管。
在接下來驗證結果時,A可以謊稱258為他想的數,375為密鑰,A還是立於不敗之地。那如果A事先把密鑰告訴B呢?B可以直接算出原始數字,失去了保密作用。
這種知道加密方法就知道了解密方法顯然行不通,那有沒有一種方法,知道了加密方法仍然無法恢復原文呢?
顯然是有的,在加密過程中加入不可逆運算就OK了。A設計新的加密方式:
假設A想的數是375,進行加密:
B拿到結果120943,但他幾乎不能根據120943反算出密匙375。
如果B想要驗證A是否說謊:
終於可以拋硬幣了……
這種丟掉一部分信息的加密方式稱為「單向加密」,也叫 哈希演算法 。
有個問題:
這個是有可能的,但可以解決,就是增加上述演算法的難度,以致於A很難很難找到。
根據以上表述,一個可靠的哈希演算法,應該滿足:
密碼學中的哈希函數有3個重要的性質,即 抗碰撞性、原像不可逆、難題友好性 。
碰撞性,就是指A同學事先找出一奇一偶使得哈希結果一致,在計算上是不可行的。
首先,把大空間桑拿的消息壓縮到小空間上,碰撞肯定是存在的。假設哈希值長度固定為256位,如果順序取1,2,…2 256 +1, 這2 256 +1個輸入值,逐一計算其哈希值,肯定能找到兩個輸入值使得其哈希值相同。
A同學,看到這里時, 請不要高興的太早。因為你得有時間把它算出來,才是你的。為什麼這么說呢?
根據生日悖論,如果隨機挑選其中的2 130 +1輸入,則有99.8%的概率發現至少一對碰撞輸入。那麼對於哈希值長度為256為的哈希函數,平均需要完成2 128 次哈希計算,才能找到碰撞對。如果計算機每秒進行10000次哈希計算,需要約10 27 年才能完成2 128 次哈希計算。
A同學,不要想著作弊了,估計你活不了這么久。當然如果計算機運算能力大幅提升,倒是有可能。
那麼完整性還用其他什麼用途呢?
用來驗證信息的完整性,因為如果信息在傳遞過程中別篡改,那麼運行哈希計算得到的哈希值與原來的哈希值不一樣。
所以,在區塊鏈中,哈希函數的抗碰撞性可以用來做區塊和交易的完整性驗證。
因為一個哈希值對應無數個明文,理論上你並不知道哪個是。就如,4+5=9和2+7=9的結果一樣,知道我輸入的結果是9,但能知道我輸入的是什麼數字嗎?
如果,對消息m進行哈希計算時,在引入一個隨機的前綴r,依據哈希值H(r||m),難以恢復出消息m,這代表該哈希函數值隱藏了消息m。
所以,B同學,根據結果想反推出原數據,這是不大可能的事,就猶如大海里撈針。
難題好友性,指沒有便捷的方法去產生一滿足特殊要求的哈希值。是什麼意思呢,通俗的講,就是沒有捷徑,需要一步一步算出來。假如要求得到的哈希結果以若干個0開頭,那麼計算找到前3位均為0的哈希值和找到前6位均為0的哈希值,其所需的哈希計算次數是呈一定數量關系。
這個可以怎麼用呢?在區塊鏈中,可以作為共識演算法中的工作量證明。
主要描述了哈希函數的3個重要性質: 抗碰撞性、原像不可逆、難題友好性 。
因為這些重要性質,區塊鏈中的區塊和交易的完整性驗證、共識演算法的工作量證明等功能用哈希函數來實現。
[1].鄒均,張海寧.區塊鏈技術指南[M].北京:機械出版社,2016.11
[2].長鋏,韓鋒.區塊鏈從數字貨幣到信用社會[M].北京:中信出版社,2016.7
[3].張健.區塊鏈定義未來金融與經濟新格局[M].北京:機械工業出版社,2016.6