自從知道了比特幣,區塊鏈,不可避免會經常遇到私鑰、公鑰、地址這一些專業名詞,私鑰是最關鍵也是最基礎的,我們先來了解一下私鑰。
私鑰必知
私鑰本質上是隨機數,由32個byte組成的陣列,1個byte等於8位二進位制,一個二進位制只有兩個值0或者1。所以私鑰的總數是將近2的(8*32)次方=2的256次方個。
既然是隨機生成的,那私鑰會不會重複?
難?非常難,幾乎不可能!
把私鑰個數轉換成10進位制,就是10的76次方,要知道,地球的年齡到目前為止是,5×10的17次方秒,可以看出來,私鑰的個數比地球的年齡還高出很多個數量級,理論上想要遍歷所有的私鑰,耗盡整個人類的能量也是不可能的。
私鑰可以用扔硬幣的方法比喻一下,硬幣的正反面相當於二進位制中的1和0。
每扔一次記錄一次結果,需要扔32×8=256次,得出一個256位的二進位制字串,這個字串就是最原始的私鑰形式。
私鑰轉換
但是我們看到的私鑰確這樣的:
5KYZdUEo39z3FPrtuX2QbbwGnNP5zTd7yyr2SC1j299sBCnWjss
這是怎麼回事呢?
我們可以想象一下,如果直接寫成二進位制的話,256位是一個比較長的字串,不但識別度不高,而且使用非常不方便,所以我們見到的私鑰是對原始的隨機數進行了Base58的轉換。
Base58簡介
在說Base58編碼之前,我們先來介紹一下Base64編碼。
Base64編碼會把3位元組的二進位制資料編碼為4位元組的文字資料,長度增加為原來的4/3
10個數字,26個大寫字母,26個小寫字母,1個+,一個 / 剛好64個字元,這種演算法相當於一種對稱加密的過程,每一個編號對應一個字元。
而Base58是為了避免混淆,將其中容易書寫辨識出錯的字元去掉,即去掉了數字0,大寫字母I,大寫字母O,小寫字母i,加號+,除號/
這樣就形成了Base58編碼,Base58演算法和Base64演算法思路一樣,只不過兩種編碼字元有所不同。
Base58編碼表如下
Base58的原理是什麼?
二進位制:0和1
十進位制:0到9
十六進位制:十進位制的基礎上加上了A-F 六個字母
而Base58我們可以看成是58進位制。
這樣,私鑰從原始256位的字串轉換成現在的樣子就可以看成是2進位制,轉換成58進位制,當然,具體人工計算的話還有湊數結尾等特殊處理。
為了加深一下印象,我們舉個例子。
私鑰的原始字串是這樣子的。
1 1 1 0 1 1 0 1 0 0 0 1 0 0 1 0 0 1 1 1 1 0 1 1 0 1 0 0 0 1 0 0 1 0 0 1 1 1 1 0 1 1 0 1 0 0 0 1 0 0 1 0 0 1 1 1 1 0 1 1 0 1 0 0 1 1 0 0 1 0 0 1 1 0 1 0 1 1 0 1 0 0 0 1 0 0 1 0 0 1 1 1 1 0 1 1 0 1 0 0 0 1 0 0 1 0 0 1 1 1 1 0 1 1 0 1 0 0 0 1 0 0 1 0 0 1 1 1 1 0 1 0 0 1 0 0 0 1 0 0 1 0 1 1 1 1 1 0 1 1 0 1 0 1 0 1 1 0 1 0 0 1 1 1 1 0 1 1 0 1 0 0 0 1 0 0 1 0 0 1 1 1 1 0 1 1 0 1 0 0 0 1 0 1 1 0 0 1 1 1 1 0 1 1 0 1 0 0 0 1 0 0 1 0 0 1 1 1 1 0 1 1 0 1 0 0 0 1 0 0 1 0 0 1 1 1 1 0 1 1 0 1 0 0 0 1 0 0 1 0 0 1 1 1 1 0
就是由256個0或者1組成,看起來是不是很麻煩。
透過Base58轉換後是這樣子的
J3mBbAH58CpQ3Y5RNJpUKPE62SQ5tfcvU2JpbnkeyhfsYB1Jcn
由於計算比較耗時,這個私鑰不是上面的字串生產的,這裡只是展示一下長度。
感興趣的老鐵可以自行轉換一下。參考下圖,我們可以看到轉換的方式和思路。
1、將3個8位元組的轉化成4個6位元組的
2、將6個位元組二進位制數轉化成10進位制,
010011就是1+2+0+0+16+0=19,
010110就是0+2+4+0+16+0=22,
000101就是1+0+4+0+0++0=5,
101110就是0+2+4+8+0+32=46
3、透過Base64表找出對應的字元就是T、W、F、u。
透過Base58表找出對應的字元是L、P、6、o
總結:
1、私鑰是一個隨機數,而這個隨機數足夠大,以至於沒有重複的可能
2、原始字串為256位的的二進位制,透過Base58轉化,變成比較短的字串,也可以理解為,將二進位制的私鑰轉化成了58進位制的私鑰。
後面我們繼續分享學習公鑰、地址的相關知識,私鑰是最關鍵,最重要的金鑰,誰掌握私鑰誰才是財產的真正的主人。