06.15 基礎課程第八課 私鑰、公鑰和地址

上一節課,我們介紹了區塊鏈中所用到的現代密碼學的相關知識,這一節,我就以比特幣為例給大家介紹區塊鏈中在安全方面的使用。

前面我們講過,比特幣的所有價值都是存儲在區塊鏈網絡中數百萬個UTXO(未花費交易輸出)中。那麼某個UTXO憑什麼證明是你的,而不是我的呢?我是不是可以隨意支配一個未用過的UTXO呢?我支付給別人的比特幣又是怎樣保證到達了我想給的人呢?在去中心化的區塊鏈世界中就是通過非對稱加密算法來保證這一系列問題的。其中主要涉及三個部分:私鑰、公鑰和地址。

一、概述

比特幣的所有權是通過數字簽名、數字密鑰和比特幣地址來確定的。每筆比特幣交易都需要一個有效的簽名才會被存儲在區塊鏈中,只有有效的數字密鑰才能產生有效的數字簽名。密鑰總是由一個私鑰和一個公鑰的形式成對出現。公鑰就像銀行帳號,而私鑰就是控制帳戶的簽名。

支付比特幣時,由比特幣的當前所有者提交其公鑰和簽名(由私鑰生成),網絡中的所有人都可以進行驗證,確認交易是否為有效交易,也就是確認支付者是否擁有交易中UTXO的所有權。

每個密鑰對包括一個私鑰和一個公鑰。私鑰是一連串隨機數,通常是隨機生成的。有了私鑰,在比特幣中通過使用橢圓曲線乘法這個單向加密函數就可以生成公鑰。有了公鑰,可以通過單向加密哈希函數來生成比特幣地址。公鑰、私鑰和比特幣地址之間的關係如下:

基礎課程第八課 私鑰、公鑰和地址

二、私鑰

比特幣的私鑰就是一串256位的隨機數字,其實最隨機的方式,就是找一枚硬幣,朝天拋擲256次,正面朝上則記為數字1,反面朝上則記為數字0,這樣隨機得到的256位二進制數字就可以作為比特幣的私鑰。也許這種辦法很笨拙,不過千萬不要用自己寫的或者編程語言內的隨機函數來生成一個隨機數,這些隨機函數都是有據可依的,所生成的隨機數也很容易被追溯到。比特幣的私鑰空間大小是2的256次方,如果換算成十進制,大約是10的77次方,而可見宇宙中估計也只含有10的80次方個原子。所以如果比特幣的私鑰能保證隨機性,基本上是不可能被破解的。

三、公鑰

比特幣系統中,通過橢圓曲線乘法,可以從私鑰計算得到公鑰,這是不可逆轉的過程:K=k * G。其中k(小寫)是私鑰,G是橢圓曲線上的生成點,而得到的結果K就是公鑰。其反向運算,從已知公鑰來反推私鑰,基本上是不可能的,就是用暴力破解的辦法,利用反覆的嘗試去算得結果,如果把全球的計算機共同組織起來計算,大概需要幾萬年可以破解,這顯然是不現實的。

那麼何為暴力破解,這裡給大家舉個例子,簡單來說明一下。比如我們最經常騎的小黃車ofo,除了藍牙開鎖之外,它可以通過輸入密碼的方式來解鎖。一般來說,小黃車的密碼是四位數字,每位數字從1到4,也就是說,如果我們可以對著小黃車手動輸入256(4*4*4*4)次組合密碼(從1111開始到4444結束),那麼一定能試出來小黃車的密碼,這樣我們就可以免費騎一次小黃車啦。假如我們輸入一次密碼需要5秒鐘,那麼理論上我們21分鐘就可以打開密碼鎖了。以上假設均基於小黃車ofo沒有其他鎖定方式,其實一般都會有連續輸錯多少次密碼就鎖定的手段,例如銀行就是這樣避免暴力破解,連續輸錯3次密碼,就鎖定賬戶。

這種通過大量試錯的破解方式,就是暴力破解,沒有什麼技巧,只要你夠快並且有充足的時間就足夠啦。而在計算機世界裡,最容易的方式就是暴力破解,因為計算機的計算能力絕非人所能相比的,比如小黃車ofo的組合密碼,對於手工操作21分鐘才能打開,而對於計算機來說,連1微秒都不需要。而上面所說的橢圓曲線算法,即使全世界的計算機加起來也要幾萬年才能破解,基本就是無可實現的了。

上圖就是通過橢圓曲線如何從私鑰計算公鑰的方法,這裡只是給大家一個初步的感官印象,具體技術細節涉及到現代密碼學知識,如果有感興趣的可以留言,我再給大家細講。

四、地址

地址是一個由數字和字母組成的字符串,可以在區塊鏈中廣播,併為所有人共知。由公鑰(一個同樣由數字和字母組成的字符串)生成的比特幣地址以數字“1”開頭。比特幣地址可由公鑰經過單向的加密哈西算法得到。其中使用的SHA256和RIPEMD160。以公鑰K為輸入,計算其SHA256哈希值,並以此計算結果計算RIPEMD160哈希值,得到一個長度為160比特(20字節)的地址,再通過“Base58Check”編碼得到我們常見的比特幣地址。

什麼是“Base58Check“呢?這要從二進制說起,眾所周知,我們的密鑰都是0/1的計算機編碼規則,但是在現實中存在一個問題,那就是在實際使用中不便於記憶。不信,我給你512個長度的0/1字符串,你抄10遍,至少會錯一次以上。也就是說,如果你用這種方法記錄你的私鑰,使用10次以後,你就會至少錯一次,然後,你就會至少支付失敗一次。為了便於記憶,採用16進制來替代二進制,也就是用0-9十個數字加上A到F六個字母來表示的一種計數方式。4位二進制形成1位16進制。512個長度的0/1字符串變成了128位,且容易記憶。接下來,為了更便於記憶和存儲,出現了Base64編碼方式,又壓縮了4倍。可是BASE64也容易認錯,又變成了Base58。Base58是26個大寫字母+26個小寫字母+10個數字,再去掉這四個元素:數字"0",大寫字母"O",大寫字母"I"以及小寫字母"l"。Base58Check就是在base58的基礎上又增加了教研功能。

公鑰通過哈希函數生成比特幣地址,當然準確說是兩次哈希(SHA256+ RIPEMD160)+一次編碼(Base58Check),所以在很多時候,比特幣的地址,其實就可以理解為公鑰啦。當然並不是所有的地址都是公鑰,它還可能是可編程腳本(這其實就是以後我要重點給大家講的智能合約的前身,只是比特幣對其支持一般,而以太坊加強了智能合約的支持)。

基礎課程第八課 私鑰、公鑰和地址

這節課,我們介紹了私鑰、公鑰和地址,可以說私鑰在區塊鏈中至關重要,由於其匿名性,如果你想證明“你是你“,這個幣是屬於你的,唯一的辦法就是用私鑰去做數字前面來證明。而私鑰的丟失或者複製,則意味著財產的轉移。所以在區塊鏈中,如何保護私鑰的安全性是第一要務,一般大家都是把密鑰對保存在”錢包“中,下一節課,我們就給大傢俱體介紹什麼是”錢包“。


分享到:


相關文章: