这是我的第五篇研读记录,抽空写了点欢迎拍砖。
首先讲一下私钥、公钥、地址的关系
私钥通过椭圆曲线相乘推出公钥,公钥通过哈希运算得出公钥哈希,即生成比特币地址。但是地址不能推出公钥,公钥不能推出私钥,所以私钥如果不泄露,基本是安全的,而公钥可以公开。
私钥
1、重要性:一旦私钥丢失或被窃取,就失去了对钱包的控制权,资产也就无法找回,所以一定要保管好自己的私钥,比如使用离线钱包。
2、数值范围:比特币私钥是256位的二进制数字,由256个0或1组成的数字,转换到十进制,其数值范围为【0,1.158x10^77-1】,接近于宇宙中原子的数量(10^80),所以私钥相同几率几乎为零,不可重复,不可被爆力搜索破解。
3、生成私钥的随机数
一定要使用密码学安全的伪随机数生成器(CSPRNG)来生成随机数,其需要符合以下条件:
1)随机性:不存在统计学偏差,完全杂乱的数列
2)不可预测性:不能从过去的数列推测出下一个出现的数
3)不可重现性:除非将数列保存下来,否者不能重现相同的数列
符合以上条件才是一个安全有效及有用的随机数。
那么随机数是怎么生成的呢?接下来我们要看一下源码,它是如何实现的。
在生成私钥之前需要获得一个强的随机字节数,代码实现于Src/random.cpp-getstrongrandbytes
首先定义一个SHA512,定义生成两个强随机内容:
1)、opensll
2)、os (操作系统本身)
通过两种方式同时实行私钥的获取,从而得到一个强的随机数,增强安全性。之后获得随机数种子(Randaddseedperfmon)下图显示了获得CPU的性能指数,为了就是要符合随机数的条件,增加安全性。
4、私钥的生成MakeNewKey
通过以上步骤得到强有力的随机数,从而得到一个非常安全的私钥值,图3就是私钥的循环生成过程:首先获得一个强的随机字节数;然后通过椭圆曲线验证私钥,直到有效为止
数值范围(0,1.158x10^77-1)
最后讲一下私钥的代码定义
“An encapuslated private key”封装的私钥(图4),定义了3个变量:
1)Fvalid:描述私钥是否有效,通过椭圆曲线方程来验证。
2)fCompressed:该私钥对应的公钥是否被压缩。
3)Keydata:私钥的数据(包含256位,32个字节)
区块链研习社源码研读班方建强