区块链学习(1)密钥,公钥和地址

  想学好区块链不了解底层技术是不行的,目前有关区块链的学习资料还不是很多,所以我也是摸着石头过河,本人文笔拙劣,有些表达不清楚的地方还望各位多多包涵。这里所根据基本都是比特币的技术,可以参考下《精通比特币》。

这一章主要讲的是私钥,公钥和地址,这三者的关系可以用《精通比特币》中的一张图来表示。

  简单来说就是私钥通过计算生成公钥, 公钥又通过了另一种计算生成了地址,而这两种计算是不可逆的,也就是说私钥可以通过计算生成公钥但得到了公钥你却无法得到生成这个公钥的私钥,公钥和地址的关系也一样是单向的。

  至于什么是私钥,公钥和地址。私钥就是一个随机数,就像是掷骰子得到的数,只不过这个随机数比较大,是一个256位的二进制数。在交易中,私钥用于生成支付比特币所必需的签名以证明资金的所有权。私钥必须始终保持机密。私钥一旦丢失,其所保护的比特币也将永远丢失。在比特币中生成私钥一般是通过随机取出一长串随机字节,对其使用SHA256哈希算法进行运算,可以简单理解为产生一个256位的数字。如果运算结果小于n-1(n为常数,略小于2^256),就有了一个合适的私钥。否则,就用另一个随机数再重复一次。

  公钥可以由椭圆曲线算法实现。关于椭圆曲线算法,可以看一下https://blog.csdn.net/jingcheng345413/article/details/54969289,应该是讲的很详细了。椭圆曲线算法是一种不可逆的加密算法。比特币采用的是y^2 mod p = (x^3+ 7) mod p。也就是secp256k1标准所定义的一条特殊的椭圆曲线和一系列数学常数。

看一下y^2=x^3+x+1  (mod 23)的图像

这里得到的图像是一个个离散的点,比特币中的类似,只不过素数p是一个很大的数,因此得到图像是一个更大,图像更复杂。上面就是椭圆曲线。现在讲讲如何生成公钥。

{K = k * G}

其中k是私钥,G是生成点,可以理解为1,2,3,4,5之类的数。在该曲线上所得的点K是公钥。至于如何进行上述公式的运算就要先讲讲椭圆曲线的加法。这里的加法与实数的加法不同。近世纪代数使得代数运算达到了高度的统一。数学家总结了普通加法的主要特征,提出了加群。在椭圆曲线上的加法法则:P + Q任意取椭圆曲线上两点P、Q (若P、Q两点重合,则做P点的切线)做直线交于椭圆曲线的另一点R’,过R’做y轴的平行线交于R。至于乘法n*p就相当于加了n次的p。

讲完了公钥,再来讲讲地址。用过比特币交易的人应该会对地址有所了解。比特币的地址通常以收款方出现。比特币的地址可由公钥经过单向的加密哈希算法得到。

A = RIPEMD160(SHA256(K))

公钥K经过SHA256加密计算,再由RIPEMD计算得到160位的数字即为地址A。但是通常我们所说的地址是指经过Base58Check编码的地址,在比特币中,大多数需要向用户展示的数据都使用Base58Check编码,Base58就是由不包括(0,O,l,I)的大小写字母和数字组成。比特币中用Base58Check编码,先在数据的头部加上一个前缀来表明数据的类型,比如这数据是私钥,公钥还是地址。再在尾部加上校验码,来检验转录产生的错误。对之前的结果(前缀和数据)运行两次SHA256哈希算法:

checksum =SHA256(SHA256(prefix+data))

在产生的长32个字节的哈希值(两次哈希运算)中,我们只取前4个字节。这4个字节就作为校验码。校验码会添加到数据之后。结果由三部分组成:前缀、数据和校验码。这个结果采用之前描述的Base58字母表编码,完整的私钥转成地址的过程可以用下图来表示

 

 

 

posted @ 2018-08-26 16:39 mambakb 阅读(...) 评论(...) 编辑 收藏