正式進(jìn)入到區(qū)塊鏈的入門學(xué)習(xí),之后會連續(xù)更區(qū)塊鏈的相關(guān)筆記。Reader此次分享的是肖臻老師《區(qū)塊鏈技術(shù)與應(yīng)用》公開課的第一講。本講主要設(shè)計BTC中的「密碼學(xué)原理」相關(guān)知識,包括哈希和簽名兩個功能。
哈希函數(shù)
密碼學(xué)中用到的哈希函數(shù)被稱為cryptographic hash function,它有兩個重要的性質(zhì):「collision resistance」和「hiding」以及「puzzle friendly」。
collision resistance
這里指哈希碰撞,例如給定兩個數(shù)x和y,當(dāng)x≠y時存在H(x)=H(y),就是兩個不同的輸入,輸出卻是相等的,這就稱哈希碰撞。哈希碰撞是不可避免的,因為輸入空間遠(yuǎn)遠(yuǎn)大于輸出空間。哈希碰撞無法人為制造,無法驗證,是根據(jù)實踐經(jīng)驗得來的,無法用數(shù)學(xué)理論證明出來。就是說給出x,很難找到y(tǒng),使得兩者的哈希值相同,除非「蠻力求解」(brute-force),但基本上是不可能求解出來的。
該性質(zhì)的作用:對一個message求digest。比如message取m,m的哈希值是H(m)=digest,如果有人想篡改m值而H(m)不變,則無法做到,篡改之后一定會被發(fā)現(xiàn)??梢杂玫綄嶋H,比如文件修改或者上傳,計算哈希值并保存,查看前后兩個哈希值是否相同。當(dāng)哈希碰撞能夠人為制造的話,哈希函數(shù)就失去了意義,比如MD5已經(jīng)能夠人為的制造哈希碰撞。
hiding
講的是哈希函數(shù)的計算過程是單向的,不可逆的,從H(x)無法推導(dǎo)出x。hiding性質(zhì)前提是輸入空間足夠大,分布比較均勻。如果不是足夠大,一般在x后面拼接一個隨機(jī)數(shù),如H(x||nonce)。
該性質(zhì)的作用:和collision resistance結(jié)合在一起,用來實現(xiàn)digital commitment(又稱為digital equivalent of a sealed envelope)。
比如進(jìn)行結(jié)果預(yù)測的時候,如果提前將預(yù)測結(jié)果公布,就會導(dǎo)致人們可以做出選擇,來推動結(jié)果的走向,如何在不公布結(jié)果而又驗證自己預(yù)測的結(jié)果是否正確,把預(yù)測結(jié)果作為輸入x,算出一個哈希值,將哈希值公布,之后再將實際結(jié)果進(jìn)行求取哈希值,并比較,hiding讓人們知道哈希值而不知道預(yù)測值,最后再將x公布,因為有collision resistance的性質(zhì),預(yù)測結(jié)果是不可篡改的,也而已保證可信度。
puzzle friendly
除了密碼學(xué)中要求的這兩個性質(zhì)外,比特幣中用到的哈希函數(shù)還有第三個性質(zhì),也就是puzzle friendly,指的是哈希值的預(yù)測事先是「不可預(yù)測」的。就是在進(jìn)行輸入時,輸入的值是無法進(jìn)行預(yù)測的,例如如哈希值是00...0XX...X組成,事先無法知道哪個值更容易算出這個結(jié)果,還是要一個一個測試尋找輸入值。
比如,比特幣挖礦的過程中實際就是找一個nonce,block header指塊頭,塊頭里有很多域,其中一個域是我們可以設(shè)置的隨機(jī)數(shù)nonce,nonce跟區(qū)塊的塊頭里的其他信息合一起作為輸入,得出的哈希值要小于等于某個指定的目標(biāo)預(yù)值。H(block header)≤target。挖礦的過程是不停的試「隨機(jī)數(shù)」,使得block header取哈希后落在指定的范圍之內(nèi)。
puzzle friendly是指挖礦過程中沒有捷徑,為了使輸出值落在指定范圍,只能一個一個去試。所以這個過程還可以作為工作量證明(proof of work)。挖礦很難,驗證很容易,就是在找到nonce時,直接進(jìn)行哈希值計算就可以比較。
比特幣中用的哈希函數(shù)叫作SHA-256(secure hash algorithm)以上三個性質(zhì)它都是滿足的。
簽名
加密體系
對稱加密:人之間信息的交流可以利用密鑰(encryption key),A將信息加密后發(fā)給B,B收到后用密鑰解密,因為加密和解密用的是「同一個密鑰」,所以叫對稱加密。
對稱加密安全的前提是有渠道可以安全地把密鑰分發(fā)給通訊的雙方。因此對稱加密的缺點(diǎn)就是密鑰的分發(fā)不方便,因為在網(wǎng)絡(luò)上很容易被竊聽。
非對稱加密:非對稱密鑰是用一對密鑰而「不是一個」,加密用公鑰,解密用私鑰,加密和解密用的都是接收方的公鑰和私鑰。
加密體系完成簽名
在進(jìn)行交易的時候,公鑰是不用保密的,私鑰要保密但是私鑰只要保存在本地就行,不用傳給對方,而公鑰可以公開,在進(jìn)行交易的時候,個人采用私鑰對信息進(jìn)行簽名,其他人采用公鑰進(jìn)行驗證簽名。
賬戶管理
其他有中心化的系統(tǒng)中,可以找一個權(quán)威的第三方實現(xiàn)賬戶的開戶,但在比特幣系統(tǒng)中是去中心化的,所以第三方不太現(xiàn)實,比特幣系統(tǒng)中開賬戶,就是在本地創(chuàng)立一個公私鑰對,這就是一個賬戶。公私鑰匙對是來自于「非對稱的」加密技術(shù)。
公鑰相當(dāng)于銀行賬號,別人轉(zhuǎn)賬只要知道公鑰就行,私鑰相當(dāng)于密碼,知道私鑰可以把賬戶上錢轉(zhuǎn)走。同時在進(jìn)行信息發(fā)布的時候公鑰和私鑰用來簽名。
例如A想向B轉(zhuǎn)10個比特幣,A把交易放在區(qū)塊鏈上,別人怎么知道這筆交易是A發(fā)起的呢?這就需要A要用自己的私鑰給交易簽名,其他人收到這筆交易后,要用A的公鑰去驗證簽名。簽名用私鑰,驗證用公鑰,用的仍然是「同一個人」的。
同時結(jié)合哈希函數(shù)的特性可知,創(chuàng)建賬戶產(chǎn)生相同公私鑰的可能性微乎其微,因此大量創(chuàng)建賬戶來竊取其他人賬戶是不可行的。
但前提是在產(chǎn)生公私鑰時有一個好的「隨機(jī)源」,好的隨機(jī)源情況下產(chǎn)生公私鑰是隨機(jī)的,但如果隨機(jī)源不好,就有可能產(chǎn)生相同的公私鑰,造成安全問題。
比特幣中用的簽名算法,不僅是生成公私鑰的時候要有好的隨機(jī)源,之后每一次簽名時也要有好的隨機(jī)源。因為只要有一次簽名用的隨機(jī)源不好的話,就有可能泄露私鑰。