区块链解读4-共识机制

解读区块链,密码学
密码经常能听到,密码学第一次给笔者深刻印象是电视剧暗算,看风那一段中,黄依依说密码学就是解一道数学题。
密码学很早之前就有了,三国中杨修的“鸡肋”事件也可认为是军队中一种密码,必须说出准确的口令才能通过,密码学作为保护真实信息传输的技术性手段,早期在军事、情报领域应用广泛。1970年之前,密码学的应用范畴大部分还是在政府层面,直到标准加密系统-数据加密标准(data encryption standard DES)和非对称加密算法的发明,密码学逐步被深入应用在各个领域。
简单介绍下密码学的三大阶段:
古典密码学:古典密码学诞生至少有两三千年的历史了,这个阶段核心思想为:置换(permutation),说起古典密码最经典的两个例子,斯巴达人的塞塔式密码:把一个长条羊皮螺旋地斜着绕在一个多棱棒上,然后水平方向从左到右写字,写一个字绕一圈。这长条羊皮拿下来看上去杂乱无章的,但是加上同尺寸的多棱棒就能看到准确的信息了。
这里写图片描述
在古代中国,藏头诗,藏尾诗早就被那些文人墨客玩坏了,如水浒传中,拉卢员外下水的那首卦歌:。芦花丛中一扁舟,俊杰俄从此地游。义士若能知此理,反躬难逃可无忧。之后又出现了一种古老的对称加密算法,凯撒算法,这类算法的基本实现原理是通过把字母移动一定的位数来实现加密和解密。明文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后被替换成密文,这种加密方式一旦掌握足够密文可以通过逆推的方式得到加密规则,但在当时这种理念还是很先进的。
这里写图片描述
(电影达芬奇密码中出现的密码道具就是用了凯撒密码原理)
古典密码学针对字符,对字符本身不做修改,通过位置的改变或者替换来隐藏信息,这种加密方式比较简单,主要通过工作或者机械的操作来加解密,一旦掌握了解密工具或者找到解密规律,信息马上就被破解了,整体安全性不高。
现代密码学:1948年10月香农Shannon(信息论之父)的信息论诞生,信息论将信息的传递作为一种统计现象来考虑,香农给出了信息熵的定义:香农
这里写图片描述
这里不深入讨论信息论,有兴趣可百度论文《A Mathematical Theory of Communication》(通信的数学理论)。
同时这也标志着密码学进入了第二阶段,现代计算机科学和信息技术的发展,之前对复杂计算的密码可以通过计算机来完成,密码学成为了一门科学。加密算法一般通过密钥来加解密,信息通过密钥加密后明文通过二进制的方式传播,一般的理解,你的密钥越长就越难破解,但是这个时候你会发现你的密钥只有一把,而且别人要解密你的信息,你必须把密钥也给对方,这种方式称为“对称加密算法”,你的密钥很关键,怎么保存,怎么传输就会很头疼。当然后来演变出来的哈希算法、公钥密码学、其实都是以现代密码学为基础。
这里写图片描述
公钥密码学:1976年后,公钥密码学出现,这个也可以称为非对称加密,和之前的对称加密最大的区别就是,加解密分别使用公钥(publickey)和私钥(privatekey),密钥以一对的方式出现。196年W.Diffie和M.Hellman发表的New Direction in Cryptography,提出了非对称密码体制的概念。非对称密码体制一般依据两类类数学问题:大整数分解问题和离散对数问题(椭圆曲线类可归此类)。
这里写图片描述

介绍了密码学的发展历史,区块链中主要运用到密码学大致有这几类:Merkle tree哈希树算法、椭圆曲线算法、SHA-256算法、Base58编码。
Merkle tree 哈希树算法:一种哈希二叉树,学过计算机数据结构的同学应该比较明白这个算法,该算法主要用于快速校验大规模数据的完整性,在比特币中、merkle树用来归纳区块中的所有交易信息、所有最终生成的区块所有交易信息都会有一个统一的哈希值,一旦有交易信息被篡改、merkle树就会改变,校验不一致。区块链每个节点会有一个merkle root值。Merkle tree一般用来进行大数据的比对,可以快速定位(O(logn))到哪一部分数据不一致。保证数据不被篡改。区块链中工作原理:非叶子节点value值通过该节点的所有值节点进行组合、组合后进行HASH计算得出hash value。
这里写图片描述
椭圆曲线算法:这个算法看的笔者是云里雾里,笔者只能根据自己的理解说出其概念,
椭圆曲线算法在比特币中的作用:计算一个或多个消息的摘要时可保证消息不会被更改,一旦更改就能发现,所以消息与摘要是一一对应的。但是如果攻击者有摘要算法,他就可以同时替换消息和摘要,如果只验证摘要是无法得知消息已被替换(更改),如何解决这一消息真实性的问题,这就是公钥密码的用途
1.首先产生消息的人公开自己的公钥,并用私钥对消息加密,也就是签名,然后整个消息、消息摘要、摘要签名一期发送给接收者。
2.每个人的公钥可随时得到,接收者用公钥解密,也就是验签。
再针对椭圆曲线密码算法数学原理简单描述下:首先要明确一个概念,在射影平面坐标系中,两条平行线在无穷远处是可以有交集的(这个和之间平行线之间没有交点有点不同了):
1.射影平面坐标系:它是对笛卡尔直角坐标系的扩展,增加了无穷远点的概念。在此坐标系下,两条平行的直线是有交点的,而交点就是无穷远点。两者的变换关系为:笛卡尔坐标系中的点a(x,y),令x=X/Z,y=Y/Z,则射影平面坐标系下的点a的坐标为(X, Y,Z),比如点(2,3)就转换为(2Z,3Z,Z)。
2.椭圆曲线:一条椭圆曲线在射影平面上满足方程:Y^2Z+a1XYZ+a3yZ^2=X^3+a2X^2Z+a4XZ^2+a6Z^3的所有点的集合,且曲线上每个点都是非奇异的(连续的、可微分的)。该方程称为维尔斯特拉斯方程(Weierstrass)。椭圆曲线并非是一个椭圆,只是其方程形式类似一个计算椭圆周长的方程。
3.射影平面转换为直角平面:椭圆曲线有一个无穷远点(0:1:0),那么把可以计算出直角平面坐标系下的曲线方程:y^2+a1xy+a3y=x^3+a2x^2+a4x+a6。这个方程代表的光滑曲线再加上一个无穷远点,就组成了椭圆曲线。
4.椭圆曲线一点切线的斜率:因为椭圆曲线平滑的,每一个点都有切线,斜率是切线的一个重要指标。它将在椭圆曲线密码算法中使用。
最后理解就是:椭圆曲线方程的所有解(x,y)再加上自定义的一个无穷远的点构成了方程的解集,由椭圆曲线的定义知道,曲线是连续的,故解集中解有无穷多个,密码学应用需要的是有限域,所以需要建立计算规则,从解集来构建一个有限元素的域,作为离散对数问题的域。所以现在有了初始的元素域,我们来构造计算规则,计算出一个符合离散对数问题的有限域Zp。椭圆曲线上的两点(不同)P、Q,P+Q=R,R的值是这样得到的:过P、Q两点的直线与椭圆曲线相交第三点R’,然后找到R’以x轴对称的点即为R;如果P、Q点相同,则过点是切线,其相交于曲线的另一点R’,同样找到以x轴对称的点即为R。事实证明,采用这种方法计算得到的点的集合满足群的大多数条件:闭合性、结合性、存在单位元和逆元。这里对具体计算坐标的公式就不做讨论了,需要了解可以查相关参考文献。还有一个问题需要定义,就是单位元即一个点θ,对任意点P,满足P+ θ=P,事实证明,这个点是不存在的,为此我们自定义一个无穷远的虚点为单位元,根据群的定义,对任意一个群元素P,其存在一个逆元-P,满足P+(-P)=θ,那么如何找到-P呢?利用前面的加法规则,可以找到-P是P关于x轴对称的点,如果点P坐标(xp,yp),则逆元-P坐标为(xp,-xp),这对于素数域上的椭圆曲线而言,实现起来非常容易, -yp=p-yp mod p。到目前为止,我们找到了构造椭圆曲线的域、群、群属性的所有内容。在某些条件下,椭圆曲线上所有点构成一个循环群,并且一定存在一个本原元,它的幂值生成了整个群(这就是离散对数问题)。为此,我们给定一个椭圆曲线E,确定本原元p和一个元素T,那么离散对数问题就是找到整数d,满足P+P+……+P=dP=T。在密码体制中,d通常为整数,也是私钥,曲线上的点T是公钥,坐标为(xT,yT),前面我们已经介绍了如何计算dP。如果回到实数上的椭圆曲线就会发现,椭圆曲线离散对数问题的几何解释也非常简单:给定一个起点P ( 公开参数) ,可以通过在椭圆曲线上来回跳跃,有效地计算2 P,3 P ,…,dP = T ( 公钥) ;然后发布起点P 和终点T。为了破译密码体制,攻击者必须弄清楚在椭圆曲线上“跳跃”的频率;而这个跳跃的次数就是密码d ,即私钥。这个图也方便理解
上面一段由于数学水平有限阅读的十分困难,但还是勉强读了几遍,如有兴趣深入理解http://blog.sina.com.cn/s/blog_d66494300102wz1a.htmlhttp://8btc.com/thread-1240-1-1.html
这个定理其实很难理解,最后笔者看到一个比喻:椭圆曲线离散对数问题犹如一个人打台球,从一个点出发,经过n次击打,把球打到指定的位置是容易的,但是告诉你球的起点和终点,让你计算击打的次数却非常困难,因为击打的方案有很多。
SHA-256算法:SHA安全散列算法(Secure Hash algorithm)是一个密码散列函数家族,有SHA-1,SHA-224,SHA-256,SHA-384,SHA-512,除了第一个其余剩下的合成SHA-2,你可以理解一代二代的概念,SHA-1是被认为MD5的后继者,MD5由中国科学家王小云破解,SHA-2比SHA-1更为安全,目前尚未出现对其有效的攻击。
SHA-256算法输入报文的最大长度不超过2^64 bit,输入按512-bit 分组进行处理,产生的输出是一个256-bit 的报文摘要。该算法处理包括以下几步:
1.附加填充比特。对报文进行填充使报文长度与448 模512 同余(长度=448 mod 512),填充的比特数范围是1 到512,填充比特串的最高位为1,其余位为0。就是先在报文后面加一个 1,再加很多个0,直到长度 满足 mod 512=448.为什么是448,因为448+64=512. 第二步会加上一个 64bit的 原始报文的长度信息。
2.附加长度值。将用64-bit 表示的初始报文(填充前)的位长度附加在步骤1 的结果
后(低位字节优先)
3.初始化缓存。使用一个256-bit 的缓存来存放该散列函数的中间及最终结果。
4.处理512-bit(16 个字)报文分组序列。该算法使用了六种基本逻辑函数,由64 步迭代运算组成。每步都以256-bit 缓存值ABCDEFGH 为输入,然后更新缓存内容。每步使用一个32-bit 常数值Kt 和一个32-bit Wt
这里写图片描述
就像上图一样,参与运算的都是 32 bit的数,Wt 是 分组之后的报文,512 bit=32bit*16. 也就是 Wt t=1,2..16 由 该组报文产生。Wt t=17,18,..,64 由 前面的Wt按递推公式 计算出来。Wt递推公式为:这里写图片描述Kt t=1,2..64 是已知的常数。上面的计算就是不断更新 a,b,c…h这 32bit*8 。在每个512bit的分组里面迭代计算64次。
5.所有的512-bit分组处理完毕后,对于SHA-256算法最后一个分组产生的输出便是256-bit的报文摘要。http://www.iwar.org.uk/comsec/resources/cipher/sha256-384-512.pdf具体sha-256算法论文。

Base58:base58是一种二进制转可视字符串的算法,主要用来转换大整数值。区别是,转换出来的字符串,去除了几个看起来会产生歧义的字符,如 0 (零), O (大写字母O), I (大写的字母i) and l (小写的字母L) ,和几个影响双击选择的字符,如/, +。结果字符集正好58个字符(包括9个数字,24个大写字母,25个小写字母)。不同的应用实现中,base58 最后查询的字母表可能不同,所以没有具体的标准。
密码学涉及到很多数学知识,还是数学没学好,很多东西看起来很累,也只看了一知半解,笔者初学区块链,很多东西也是慢慢摸索,之所以写下这些概念一方面作为自己学习的整理,另一方面也希望更多交流学习的机会。有兴趣可以关注我的公众号或者加我微信
这里写图片描述
这里写图片描述

猜你喜欢

转载自blog.csdn.net/sxjinmingjie/article/details/77122007