這是我的第五篇研讀記錄拆撼,抽空寫了點歡迎拍磚。
首先講一下私鑰竭贩、公鑰莺禁、地址的關(guān)系
私鑰通過橢圓曲線相乘推出公鑰,公鑰通過哈希運(yùn)算得出公鑰哈希肪获,即生成比特幣地址孝赫。但是地址不能推出公鑰较木,公鑰不能推出私鑰,所以私鑰如果不泄露青柄,基本是安全的伐债,而公鑰可以公開。
私鑰
1致开、重要性:一旦私鑰丟失或被竊取峰锁,就失去了對錢包的控制權(quán),資產(chǎn)也就無法找回双戳,所以一定要保管好自己的私鑰虹蒋,比如使用離線錢包。
2飒货、數(shù)值范圍:比特幣私鑰是256位的二進(jìn)制數(shù)字魄衅,由256個0或1組成的數(shù)字,轉(zhuǎn)換到十進(jìn)制塘辅,其數(shù)值范圍為【0晃虫,1.158x10^77-1】哲银,接近于宇宙中原子的數(shù)量(10^80),所以私鑰相同幾率幾乎為零亚脆,不可重復(fù),不可被爆力搜索破解弥喉。
3由境、生成私鑰的隨機(jī)數(shù)
一定要使用密碼學(xué)安全的偽隨機(jī)數(shù)生成器(CSPRNG)來生成隨機(jī)數(shù)讥蟆,其需要符合以下條件:
1)隨機(jī)性:不存在統(tǒng)計學(xué)偏差瘸彤,完全雜亂的數(shù)列
2)不可預(yù)測性:不能從過去的數(shù)列推測出下一個出現(xiàn)的數(shù)
3)不可重現(xiàn)性:除非將數(shù)列保存下來,否者不能重現(xiàn)相同的數(shù)列
符合以上條件才是一個安全有效及有用的隨機(jī)數(shù)结榄。
那么隨機(jī)數(shù)是怎么生成的呢?接下來我們要看一下源碼视哑,它是如何實現(xiàn)的黎炉。
在生成私鑰之前需要獲得一個強(qiáng)的隨機(jī)字節(jié)數(shù),代碼實現(xiàn)于Src/random.cpp-getstrongrandbytes
首先定義一個SHA512,定義生成兩個強(qiáng)隨機(jī)內(nèi)容:
1)菌赖、opensll
2)堕绩、os (操作系統(tǒng)本身)
通過兩種方式同時實行私鑰的獲取,從而得到一個強(qiáng)的隨機(jī)數(shù)黍氮,增強(qiáng)安全性沫浆。之后獲得隨機(jī)數(shù)種子(Randaddseedperfmon)下圖顯示了獲得CPU的性能指數(shù)专执,為了就是要符合隨機(jī)數(shù)的條件争剿,增加安全性蚕苇。
4、私鑰的生成MakeNewKey
通過以上步驟得到強(qiáng)有力的隨機(jī)數(shù)蹬碧,從而得到一個非常安全的私鑰值,圖3就是私鑰的循環(huán)生成過程:首先獲得一個強(qiáng)的隨機(jī)字節(jié)數(shù)罗心;然后通過橢圓曲線驗證私鑰,直到有效為止
數(shù)值范圍(0飒箭,1.158x10^77-1)
最后講一下私鑰的代碼定義
“An encapuslated private key”封裝的私鑰(圖4)强窖,定義了3個變量:
1)Fvalid:描述私鑰是否有效,通過橢圓曲線方程來驗證未巫。
2)fCompressed:該私鑰對應(yīng)的公鑰是否被壓縮劈伴。
3)Keydata:私鑰的數(shù)據(jù)(包含256位,32個字節(jié))
? ? ? 區(qū)塊鏈研習(xí)社源碼研讀班方建強(qiáng)