《Master Bitcoin》学习笔记01 (2)

  上面的k就是私钥,而点k*G是公钥,我不打算从数学的角度来给予椭圆曲线加密算法的陷门函数是难解决的,我们观察这样一个事实,从G点,我们能轻易地通过k得到目标点,但很难从目标点得到G点,这个单项陷门函数显然要比整数分解问题难很多,这篇文章里用了一个很形象的比喻,长度为256的密钥,从公钥中解出私钥,解RSA消耗的能量能煮沸一汤匙水,而解椭圆曲线能把地球上的所有水都煮沸,RSA密钥要达到同样的效果,需要2380bits的。椭圆曲线和RSA效率高下立判,事实上,现在很多安全协议除非在设计中用到RSA的机制,否则都已经升级为了椭圆曲线加密。

比特币地址

  在上面椭圆曲线中,我们得到了公钥,对这个公钥进行Hash,就能得到唯一标识的比特币地址,在Hash处理中,用到了两个Hash函数:①SHA-256,②RIPEMD160,通过下面这样的方式构建比特币地址(为什么要两次HASH,我也不太清楚,不过我查到的资料说是RIPEMD160有缺陷,不能只用RIPEMD160,具体等看源码再说)。

《Master Bitcoin》学习笔记01

  HASH算法将任意长度的二进制值映射为较短的固定长度的二进制值,这个小的二进制值称为哈希值。Hash函数有两个特性:①数据一旦产生哈希值,那么就不可能通过单一的哈希值解出原始的数据。(上面的加密体制只是不知道私钥难解,知道密钥易解,HASH没有密钥,不能解)②独特性,两个不同的数据是不能产生同样的哈希值,事实上,数据就算改变一个bit,HASH得到的结果也完全不同,在bitcoin中,用于验证接收者是否正确(因为比特币的转账过程,需要输入转账人的公钥,并用自己的私钥签名(别人能用你的公钥,从这个签名中知道这是你,但不知道你的私钥,方法就是加密的逆过程),从账单就能知道是你(你自己的私钥签名)转账给别人(别人的公钥)),此处我们只关心公钥做HASH用来确定收账者地址(转账,只用知道别人公钥的HASH就行了)。

  SHA-256——将公钥转化为256长的bit串  链接给出代码描述

  RIPEMD160——将256长的bit串HASH成160长的bit串  自行百度或者bing吧,我打算看源码的时候再看相关实现

  在进行Hash处理后,得到的其实只是0,1比特串,现在需要将0,1比特串转化为我们人可读的形式,人的十个指头衍生出的十进制是现在大家最熟悉的数字运算方式,但是除此之外,数据也能表示成2进制,8进制,16进制,比如11(10进制)=1011(二进制)=13(8进制)=B(16进制),Bitcoin的实现中,用到了BASE58的进制编码方式

BASE64、BASE58、BASE58_CHECK

  BASE64就是64进制了,它的字符表示是:0-9,a-z,A-Z,+,/

  BASE58 的字符表示在BASE64的基础上去掉了容易让人误解的0和O,l(L的小写字母),I(i的大写字母),+,/

  BASE58_CHECK 是为了在传输过程中发生错误而加入的验证位,具体验证如下:

《Master Bitcoin》学习笔记01

  prefix就是加在HASH之后160bits字符串的前缀(加此前缀表明使用BASE58_CHECK验证),而从checksum中抽取前面4个字节(共16bits),加在160bits的后面,这样形成的就是BASE58_CHECK形式的编码。

  使用编码一是为了人类可读,二是为了传输方便,下图中的前缀声明版本号,是因为,BASE58_CHECK不光用于比特币地址的编码,还用于比特币的其他编码,如私钥的版本号就和公钥不一样。

《Master Bitcoin》学习笔记01

压缩格式的公钥——为了节省空间

  从前面椭圆曲线加密方案中,我们知道,公钥P(x, y)是椭圆曲线上的一个点,而椭圆曲线是个只含x, y的二元方程,这就意味着,知道x,就能求出y,唯一一点缺陷就是不知道这样求出来的y是正还是负,这可以在压缩公钥P前,通过指定P的前缀来判断,于是,此时就将P压缩成x,从P(256bits, 256bits)中节省了256bits,这样随着区块链的不断延长,就能节省大量的空间。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zyjpyy.html