比特币源码研读之密钥篇

96
方建强
2018.03.02 22:26 字数 800

这是我的第五篇研读记录,抽空写了点欢迎拍砖。

首先讲一下私钥、公钥、地址的关系

图片发自简书App

私钥通过椭圆曲线相乘推出公钥,公钥通过哈希运算得出公钥哈希,即生成比特币地址。但是地址不能推出公钥,公钥不能推出私钥,所以私钥如果不泄露,基本是安全的,而公钥可以公开。

私钥

1、重要性:一旦私钥丢失或被窃取,就失去了对钱包的控制权,资产也就无法找回,所以一定要保管好自己的私钥,比如使用离线钱包。

2、数值范围:比特币私钥是256位的二进制数字,由256个0或1组成的数字,转换到十进制,其数值范围为【0,1.158x10^77-1】,接近于宇宙中原子的数量(10^80),所以私钥相同几率几乎为零,不可重复,不可被爆力搜索破解。

3、生成私钥的随机数

一定要使用密码学安全的伪随机数生成器(CSPRNG)来生成随机数,其需要符合以下条件:

1)随机性:不存在统计学偏差,完全杂乱的数列

2)不可预测性:不能从过去的数列推测出下一个出现的数

3)不可重现性:除非将数列保存下来,否者不能重现相同的数列

符合以上条件才是一个安全有效及有用的随机数。

那么随机数是怎么生成的呢?接下来我们要看一下源码,它是如何实现的。

图1(Src/random.cpp)

在生成私钥之前需要获得一个强的随机字节数,代码实现于Src/random.cpp-getstrongrandbytes

首先定义一个SHA512,定义生成两个强随机内容:

1)、opensll

2)、os (操作系统本身)

通过两种方式同时实行私钥的获取,从而得到一个强的随机数,增强安全性。之后获得随机数种子(Randaddseedperfmon)下图显示了获得CPU的性能指数,为了就是要符合随机数的条件,增加安全性。

图2(Src/random.cpp)

4、私钥的生成MakeNewKey

通过以上步骤得到强有力的随机数,从而得到一个非常安全的私钥值,图3就是私钥的循环生成过程:首先获得一个强的随机字节数;然后通过椭圆曲线验证私钥,直到有效为止

数值范围(0,1.158x10^77-1)

图3

最后讲一下私钥的代码定义

“An encapuslated private key”封装的私钥(图4),定义了3个变量:

1)Fvalid:描述私钥是否有效,通过椭圆曲线方程来验证。

2)fCompressed:该私钥对应的公钥是否被压缩。

3)Keydata:私钥的数据(包含256位,32个字节)

图4

      区块链研习社源码研读班方建强

日记本
Web note ad 1