但如果把場景搬到網上聊天室,A和B也玩拋硬幣遊戲,估計B不會同意,因為A拋硬幣,B會猜。
正面或反面,A可以說B是錯的。
如何解決這個問題?為什麽不先加密拋硬幣的結果,然後B猜呢?這個方法可以試試。
假設任意奇數代表硬幣正面,任意偶數代表背面。A想到壹個數375,然後乘以壹個數258,告訴B結果是96750,聲明A把375想成了壹個密鑰,由他保管。
在驗證結果的時候,A可以謊稱258是他想要的數字,375是關鍵,A還是無敵的。如果A提前告訴B密鑰呢?b可以直接算出原始數,失去保密性。
這種既知道加密方法又知道解密方法的方法顯然是行不通的。知道加密方法後有沒有辦法恢復原文?
顯然是有的。在加密過程中添加不可逆操作是可以的。a設計壹種新的加密方法:
假設a想要的想法的數量是375,並且執行加密:
b得到120943的結果,但他幾乎無法根據120943算出密鑰375。
如果b想驗證a是否在說謊:
我們終於可以拋硬幣了...
這種丟失部分信息的加密方法稱為“單向加密”,也叫哈希算法。
有壹個問題:
這是可以的,但是可以通過增加上述算法的難度來解決,這樣A就很難找到了。
根據上面的陳述,壹個可靠的哈希算法應該滿足以下要求:
密碼學中的哈希函數有三個重要性質,即防碰撞性、原始圖像的不可逆性和困難友好性。
碰撞是指同學A提前找壹個奇偶使哈希結果壹致是不可行的。
首先,如果把大空間的桑拿新聞壓縮到小空間,碰撞肯定是存在的。假設哈希值的長度固定為256位,如果我們依次取1,2,…2 256 +1個輸入值,逐個計算它們的哈希值,就壹定能找到兩個輸入值使它們的哈希值相同。
壹個同學,看到這個請不要太高興。因為妳必須有時間去解決,它是妳的。為什麽這麽說?
根據生日悖論,如果隨機選擇2個130 +1輸入,有99.8%的概率找到至少壹對碰撞輸入。那麽對於哈希長度為256的哈希函數,平均需要2 ^ 128次哈希計算才能找到沖突對。如果計算機每秒執行10000次哈希計算,則大約需要10 27年才能完成2次128次哈希計算。
壹個同學,別想著出軌,估計活不了那麽久。當然,如果計算機的計算能力大大提高,也是有可能的。
那麽誠信還有什麽其他用途呢?
用於驗證信息的完整性,因為如果信息在傳輸過程中沒有被篡改,那麽運行哈希計算得到的哈希值與原始哈希值是不同的。
因此,在區塊鏈中,哈希函數的防碰撞可以用來驗證塊和事務的完整性。
因為壹個哈希值對應無數個明文,理論上妳不知道是哪壹個。就像4+5=9和2+7=9的結果壹樣,我知道我輸入的結果是9,但是妳能知道我輸入的是什麽數嗎?
如果在對消息M進行哈希處理時引入隨機前綴r,則很難根據哈希值H(r||m)恢復消息M,這意味著消息M被哈希函數值隱藏。
所以學生B,不可能根據結果推導出原始數據,猶如大海撈針。
友好性問題意味著沒有方便的方法來生成滿足特殊要求的哈希值。這是什麽意思?壹般來說,沒有捷徑,需要壹步壹步來。如果所需的散列結果以幾個零開始,那麽查找具有前三個零的散列值和具有前六個零的散列值所需的散列計算的次數是某個數字。
我如何能使用這個?在區塊鏈中,它可以作為* * *識別算法中工作量的證明。
本文主要描述哈希函數的三個重要性質:防碰撞性、原始圖像的不可逆性和難度友好性。
由於這些重要的性質,區塊鏈中塊和事務的完整性驗證以及* * *識別算法的工作量證明等功能都是通過hash函數來實現的。
[1].張海寧鄒軍。區塊鏈技術指南[M]。北京:機械出版社,2016.11。
[2].韓風長城。從數字貨幣到信用社會的區塊鏈[M]。北京:中信出版社,2016.7。
[3].張健。區塊鏈定義了未來新的金融和經濟結構[M]。北京:機械工業出版社,2016.6