比特幣中的密碼學原理

weixin_47251563發表於2020-11-08

比特幣中的密碼學原理



開發工具與關鍵技術:密碼學原理
作者:唐文堅
撰寫時間:2020.11.8
比特幣又叫做加密貨幣但是叫加密貨幣其實它是不加密的,所有交易都是公開透明的。
在開始講比特幣裡面的密碼原理前先來說一下密碼學裡面的兩個重要的性質。
雜湊函式:
密碼學裡雜湊函式被稱為:cryptographic hash function
它有兩個重要的性質,分別為:collision resistance、hiding
這個地方的collision指的是雜湊碰撞,當x≠y時新增上雜湊碰撞後H(x)=H(y)兩個不同的輸入算出來的雜湊值是相等的,雜湊碰撞是比較常見的比如在使用雜湊表的時候就會有雜湊碰撞,雜湊碰撞不同的輸入可能會對映到雜湊表裡相同的位置,一般來說雜湊碰撞是不可避免的因為輸入空間遠遠要大於輸出空間,就比如說有個256位的雜湊值輸出空間的雜湊取值可能是2的256次方而輸入空間可以是無限大的,所以有如此多種的可能性按照戈隆原理必然會有兩個輸入是被對映到同一個輸出的情況,所以這裡的collision resistance不是說不會出現雜湊碰撞,有的書上是說collisionfree這裡會誤導我們認為不會出現碰撞,其實這個碰撞是客觀存在的它這個意思是說沒有什麼方法去認為製造雜湊碰撞,如果說我硬是要弄出雜湊碰撞其實也不是不可以的,你可以去遍歷x和y找到它們的雜湊值(輸入的所有可能的取值).
這個叫做brute-force:遍歷輸入的所有取值最後找到雜湊值恰好碰撞在一起,那如果說輸入空間比較大對於雜湊值是256位的這種方法就不太可能的,也就是說brute-force這個方法只適合數值較小的位數。
那麼這個collision resistance的作用是什麼呢?
比如我們去一個msg m我們取它的雜湊值H(m)如果我改了H(m)這時collision resistance會檢測到這個m’
可是有找不到這個m’取雜湊值後與原來的H(m)恰好相等就是沒有辦法去篡改而不被發現。
再簡單來說我以前把一個內容上傳到雲盤過了一段時間我又要從雲盤裡下載回來可是怎麼保證這個內容是同一個內容呢?這裡就需要collision resistance,上傳時留一個雜湊函式在本地下載時再算一個雜湊函式來與本地的雜湊函式做對比這樣就知道我重新下載的內容有沒有被篡改。
有一點是要知道的是沒有一個雜湊函式是在數學裡可以證明的,這個只能靠實踐中的經驗而得到的不過呢還是有那麼一個雜湊函式是可以找到的,那就是MD5以前人們以為它很安全但是現在已經可以認為的去製造雜湊碰撞了。
Hiding:
是指雜湊函式的計算過程是不可逆的,比如給一個x算出x的雜湊值H(x),可是x←≠H(x)如果說你就是想知道的話也不是沒有辦法的就是用蠻力把這個可能的取值都遍歷一遍。
hiding的成立的前提是這個輸入空間要足夠的大使得這種蠻力破解的方式變得不可行,而且這個輸入的分佈也要均勻,如果說輸入空間是足夠大的但是分佈是比較集中的用那種蠻力破解的方法還是可以破解的。
Hiding這個性質可以和collision resistance結合在一起使用的結合在一起叫做
digital equivacentcent也可以叫做digital equivacentcent of a sealedenvelope,sealedenvelope在現實中可以理解成預測而digital equivacentcent就是這樣的一個性質,在一件事開始之前預測出結果因為collision resistance的檢查和hiding的性質不可逆的特性因為結果要是有改動就就和一開始的雜湊值對不上了。如果說預測的指數不是太大的話可以在x(值)後新增一個隨機數然後整個取雜湊H(x ||nonce)保證輸入是隨機的分佈也是足夠均勻的。
除密碼學裡的兩個性質以外,比特幣裡還有用到一個puzzlefriendly的性質意思就是雜湊值得計算是事先不可預測的想要一個雜湊值得話就只能一遍一遍地去試沒有捷徑。
那這個性質為什麼叫做puzzlefriendly?
比特幣中有一個挖礦的的過程,挖礦實際上就是找一個nonce隨機數跟區塊的塊頭合在一起作為輸入取出一個雜湊來這個值要≤指定的目標值,就是H(block heolder) ≤target區塊鏈就是一個個區塊組成的連結串列,區塊裡有一個塊頭就是這個block heolder其中有一個域是我們可以設定的nonce,挖礦的過程就是去試各種不同的隨機數使得整個的block heolder取雜湊值後落在指定的值裡,所以這個過程才可以作為工作量的證明
Proof of work,如果有人挖到了把結果公佈出去其他人要驗證是不是真的其實很簡單隻要算一次雜湊值就行了
nonce作為header的一部分看看是不是≤要知道的target,這就是挖難驗易。
而比特幣中的雜湊函式叫做:SHA-256
這個SHA的意思是Secare Hash Algorithm之前的三個性質它都是滿足的。
比特幣的交易:
在本地建立一對公私鑰對採取非對稱的方式進行交易,這樣可以解決對稱加密帶來的不便,兩方交易中輸出放只要知道輸入放的公鑰就好(公鑰顧名思義就是公開的,私鑰就是不公開的)而輸入方拿自己的私鑰解開就行,這就類似於我們現實裡的銀行轉賬不過與現實中不一樣的是沒有第三方的介入,還有個作用就是簽名當我輸出一些比特幣(在區塊鏈釋出時)給別時,那別人是怎麼知道是我發的呢?這個時候就需要輸出方的私鑰這些比特幣簽名其他人收到後再用我都公鑰驗證資料的準確性(就像在現實裡我給你轉賬的時候系統會告訴你是哪個賬戶轉的一樣)。
那麼問題來了,既然公私鑰是本地生成的如果有人惡意生成多個公私鑰來讓新生成的公私鑰與區塊鏈裡已有的一樣怎麼辦?
這種想法理論上是可行的,但是在256位的雜湊值裡產生相同的值得概率是微乎其微的,這個概率比地球爆炸都要小。前提是生成公私鑰的時候是有好的隨機源,如果沒有那麼之前的就不成立了。
比特幣中的簽名演算法不光是生成公私鑰的時候要有好的隨機源交易時也是要有好的隨機源的。

相關文章