3.1 哈希算法的基本原理
小明要讀懂中本聰的論文,知道什么是區塊鏈,首先需要掌握一些密碼學的基礎知識,因為整個比特幣系統建立在數據加密的基礎上,顯然也只有這樣,才能維持一個數字資產體系的安全。計算機密碼學是以各類算法為基礎的。所謂算法,是指為解決某個問題而設計的按一定規則執行的一系列指令。在計算機加密過程中,只有通過各類加密算法,才能把一段明文信息轉換為加密信息。
對于區塊鏈,包括其應用——比特幣,哈希算法都是最常用的加密算法之一。“哈希”這個詞聽起來很奇怪,其實它源自英語,是“hash”這個單詞的音譯。哈希算法還有很多其他翻譯名稱,比如“散列算法”“雜湊算法”等。此前,在計算機類的文獻中,“hash”常譯作“散列”,但在區塊鏈中,由于“哈希指針”“哈希樹”“哈希表”等名詞(見圖3.1)已經約定俗成地成為固定稱呼,因此本書中統一把“hash”譯作“哈希”,以保持全書技術名詞的一致性。
圖3.1│常見的哈希名詞示例
哈希算法是一種用于加密的數學運算,密碼學界在哈希算法的基礎上研發出了多種系列算法,例如,美國國家安全局設計的SHA系列算法。哈希算法也和我們的生活密切相關,當你去銀行開一個賬戶時,你的取款密碼實際上就是通過哈希算法進行了加密,你使用銀行的U盾來存取款時,它里面的數據也是通過哈希算法處理過的,以保證數據的安全。既然哈希算法如此高明,大部分人可能會認為它非常枯燥復雜且難以理解。請不要擔心,下面就用通俗的語言描述它的基本原理,即使你只知道簡單的數學知識,也可以看懂。
哈希算法從本質上來說,是對一段信息的轉換。打個比方,小明的單位開了個無比重要的大會,單位領導慷慨激昂地進行了3個小時的主題發言,洋洋灑灑好幾萬字。會后為了進行宣傳,頭腦靈光的小明把領導講話的內容進行了歸納總結和加工,縮減成200個字的“豆腐塊”,發表在報紙上。那么可以近似認為,小明對領導的講話進行了一次哈希計算(即通過哈希算法進行計算),把洋洋灑灑幾萬字轉換成了“豆腐塊”。當然,實際上的哈希計算比這更復雜一點,因為它不是把信息轉換成文字,而是轉換成一段數字,最終這段數字和領導發言之間建立一一對應的關系。所以,可以認為,哈希計算實際上就是對信息進行映射的一種方法,它通過專門的數學方法,對原信息進行加密計算,把原信息變成一段簡潔的加密數據,這樣原信息和加密數據之間就形成了對應關系。原信息稱為明文,加密數據稱為密文。
為了加深直觀的認識,下面設計一種簡單的哈希算法。假設小明要給翠花寫一封情書,并且想用哈希算法對它進行加密。情書開頭的幾個字是“翠花你好,在這個陽光燦爛的日子”。小明設計了一個名叫QS的哈希算法對這句話進行加密,具體步驟如下。
(1)首先取每個字的筆畫數,比如“翠”字為14畫,“花”字為7畫,其他字的筆畫依次為7、6、6、7、3、6、6、7、9、8、4、3。對于逗號,我們規定它的取值為0。
(2)把所有的數字相加,得到93。
通過這個簡單的哈希算法,小明把情書的第一句話加密成了數字93,93就稱為哈希值,也就是QS(情書第一句話)=93。如果小明所有的情書都可以這樣處理,倒是可以為他節省不少苦思冥想的時間。但實際上這是行不通的,因為即使小明把93這個數字發給翠花,翠花也不知道他是什么意思。即使翠花知道這個哈希算法的細節,她也無法把哈希值“93”還原成小明情書的第一句話。因為在進行哈希計算的過程中,已經丟失了很多信息。但是,反過來說,如果翠花知道這個哈希算法,并知道“翠花你好,在這個陽光燦爛的日子”這句話,她同樣可以計算得出93。也就是說,可以驗證小明這句話代表的數字是93,如圖3.2所示。通過哈希算法,就可以編制一個密碼表,把小明的每句話和對應的密文數字放在表中,就可以根據數字來查出小明的話。
圖3.2│哈希算法的計算過程示例
說到這里,大家可能會發現一個問題,如果小明情書的其他句子加密后也是數字93,那怎么知道93到底代表哪句話?確實,這個哈希算法QS過于簡單,導致有很大可能使得小明其他的話在加密后也是93。也就是說,不同的明文,加密后得到的密文一樣。這個問題稱為“哈希碰撞”,如圖3.3所示。要設計一個合格的哈希算法,必須要使得這個算法產生哈希碰撞的可能性非常小,小到在實際應用中幾乎不可能出現,這樣明文和密文才能一一對應。比特幣系統所使用的哈希算法稱為SHA256算法,它是一個優秀的哈希算法,產生哈希碰撞的可能性極小,可以近似認為不會產生碰撞。當然,它的加密計算過程也是非常復雜的,是由美國國家安全局的數學專家設計的,比小明設計的QS算法要復雜很多,即使用計算機執行SHA256算法,也需要很長時間。實際上,在比特幣系統中,當礦工用計算機進行比特幣挖礦時,就是使用SHA256算法反復進行成千上萬次的計算。
圖3.3│哈希算法的計算和哈希碰撞