比特币源码研读(1)—— 私钥、公钥和地址

导读:

        简单的于现实世界类比,比特币中的私钥=银行密码,比特币中的公钥=银行账号,比特币中的地址=收款方,可以用公钥查询收款方是不是真正的收款方。

        当比特币钱包调用getnewaddress函数的时候,会产生一个密钥对以及地址,供以转账,收款等等功能。

        三者生成关系如下图:


比特币源码研读(1)—— 私钥、公钥和地址_第1张图片

私钥:

        私钥是一个介于 1~2^256-1 的一个数,可以自己写这么一个数,也可以由计算机调用密码学安全的伪随机数生成器(CSPRNG),并且需要有一个来自具有足够熵值的源的种子,来确保私钥的安全性。而2^256个数足够大,足以保证我们每个人生成的私钥都不一样。

公钥:

        通过椭圆曲线乘法可以从私钥计算得到公钥,K(公钥)=k(私钥) * G(生成点的常数点),注意该算法可以在一个方向上做乘法,但是不能在相反的方向上做。所以私钥生成公钥的过程是不可逆的,只能通过枚举来得到公钥,但是在现有计算能力下,没办法在很短的时间内将所有私钥枚举一遍。

地址:

        比特币地址可由公钥经过单向的加密哈希算法得到。以公钥 K 为输入,计算其SHA256哈希值,并以此结果计算RIPEMD160 哈希值,得到一个长度为160位(20字节)的数字:A = RIPEMD160(SHA256(K)),最后经由Base58Check编码,得到比特币地址,该方法也是不可逆的,但是可以用公钥验证该地址是不是由该公钥生成的。


最后留下一个问题:

        前提,比特币钱包中会存储多个密钥对,此时备份钱包A,如果这个时候,用getnewaddress产生一个新地址(C)之后,并向这个地址打了一点比特币,此时钱包为B,如果没有备份钱包B,也没有备份私钥,但是有备份钱包A,那么能找回新地址C的币吗?为什么?

        下一章解答这个问题。



作者:区块链研习社比特币源码研读班,旋剑

你可能感兴趣的:(比特币源码研读(1)—— 私钥、公钥和地址)