区块链作为目前最为火热的计算机相关技术之一,收到越来越多人的关注,互联网巨头们纷纷入场,区块链创业公司也不停涌现,这里对区块链相关基础知识做一个系统介绍,旨在普及区块链基础知识点。不涉及项目推广投资,单纯的对区块链相关基础知识概念作一个说明讲解。涉及相关内容如理解有误,也请及时指正。
这里先简单对区块链及相关术语做一个整理。包括区块链的概念和在查阅资料时候会常见到的一些词汇。
首先是区块链,提到区块链,肯定会听到两个比较最为普遍的词汇,一个是中本聪,一个是比特币。
中本聪,《比特币-一种点对点的电子现金系统》 论文作者,同时也是比特币的创造者,2008年创世论文诞生,2009年一月三号,比特币系统运行,也是中本聪奇迹的开始。中本聪一个神秘的人物,有人认为是一个人,也有人认为中本聪是一个组织。
比特币,时下最为火爆的加密数字货币,2017年比特币价格一路疯涨,今天一个比特币的收盘价应该5万人民币左右。比特币在论文中,描述为一种电子货币及相关算法。之后比特币的底层技术,被人们逐渐认识重视,然后抽象出来,这就是现在所说的区块链技术,所以从认知普及来说,可以理解为,先有比特币,再有区块链。比特币实现了一种,不需要通过任何中介机构,即可实现比特币网络中各个节点之间的支付交易,保持使用者匿名,当然匿名这个概念之后有机会可以扩展理解下。同时比特币中交易无法撤销,所有记录不可修改,保证所有交易记录可被追溯。
说了中本聪和比特币后,进入正题,什么是区块链:
现在在网络上搜索区块链,大致是这样的解释:区块链是分布式数据存储、点对点存储、共识机制、加密算法等计算机技术的新型应用模式。本质上区块链是一个去中心化数据库,也常说是分布式统一账本,区块之间通过一串使用密码学相关的字符串相关联。一个个区块串联成为区块链,每一个区块中包含了网络中的交易数据及相关信息。
区块链实现的不简单是一种去中心化数据库或者分布式统一账本,通过时间顺序将区块顺序相连后,基于数学密码学,共识机制、保证了数据的不可篡改和不可伪造。
上面提到了一些相关技术,有计算机网络基础的人会发现,这些技术单独拆开来看,都不是一个新的技术,并且这些相关技术,之前都有成功的应用。所以我们常说,区块链是把之前相关成熟技术良好的结合在一块,创造的一种新的技术架构,这种新的架构,利用链式数据结构验证和存储数据,使用分布式共识算法来生成写入数据,通过密码学的方式来保证数据传输和访问的安全,同时利用智能合约编程和操作数据来建立一个全新的分布式基础架构。这种新的模式,实现了去中心化,信息匿名、数据不可修改可追溯,最为关键是创立了一种新的信任的模式。更多人理解,区块链是下一代价值互联网的基础。
对几个区块链相关概念做下简单说明:
去中心化,其实中本聪的论文中并没有明确说明去中心化这个概念,去中心这个概念也是国内翻译过来理解,随着现在区块链技术1.0、2.0、甚至3.0的发展,去中心化的概念在结合实际应用落地,现在更多提及为一种多中心化,弱中心的理解,当然可能在听到一些演讲的时候,针对区块链中这些中心化的概念都会有一定的争议,这个看个人的理解,但是不可否认,区块链的经典应用,比特币中去中心化被设计的很聪明且很成功。大多数人理解去中心化,就是不需要中介权威机构介入,各个节点直接达成协议即可把相关信息生成。网络中去中心化,那么权力就属于参与其中的大多数节点,而不是几个特权节点。这个之前传统的中心化认证有很大区别。
共识机制:在区块链系统中实现不同节点之间建立信任,获取权益的数学算法。先说明下所有的共识机制都不是完美的,或多或少都会发现共识机制在特定条件下都会出现一些不可避免的缺陷,所以根据各个共识机制的优缺点选择不停的应用场景。共识机制是解决各个独立节点之间互相信任的问题,在众多节点中达到一种较为平衡的一致性状态就是所谓的共识机制,共识机制是保障区块链一直稳定运行的关键,在《精通比特币》一书中,说到共识机制和挖矿的时候,提及过这样一个理解,区块链中的共识是一种保证区块链安全的手段,在比特币中使用的是POW的共识机制,这种方式最早出现在电子邮件系统中过滤垃圾邮件。这种共识就是向全网证明自己做了足够的工作才获得了记账权。
加密算法: 算法是学习区块链中最为头疼的一块,也是最为让人信服的一块,这里只说下非对称加密,简单理解为,加密和解密的过程中分别使用两套密码,加密时候的密码是公钥,公钥对外公开,每个人都可以用公开的公钥来加密一段字符,但在解密时需要个人自己保存的另一套密码,也就是私钥,个人用私钥来解密解读用公钥加密的字符。目前区块链中用到算法有hash算法、merkle tree哈希树算法、椭圆曲线算法、SHA-256哈希算法、Base58编码等。数学算法保证信任问题。
数字货币:货币的概念这里不做深入说明,我们先说下电子货币,电子货币是通过电子化方式支付的货币,一般理解为,使用一定量的现金或者存款,通过银行或者第三方快捷支付服务,将余额进行交易转移。虚拟货币,这个不是指真实的法币,不做太深刻的分析,就理解为qq中的q币或者一些网络游戏中的游戏币,用来购买交易游戏或虚拟环境中的的货物。数字货币比上述两种来的更为复杂,一般结合区块链,我们讲到的数字货币指的是加密数字货币。通过加密算法、共识机制来保证运行。以比特币为例,论文中称为点对点电子现金支付系统。
总结下:
区块链是一系列技术结合的新应用模式,它包含了密码学、算法、分布式架构、P2P网络等一系列的技术,2009年中本聪创造了比特币,随着比特币的火热让人们逐渐认识和重视区块链。区块链被理解为去信任化“机器”,普遍认为它能实现互联网的价值传递,是新一代价值互联网架构的基石。目前对区块链技术的应用研究也层出不穷,比特币、莱特币等一系列的数字货币,以太坊、IBM的超级账本,国内各大互联网巨头和一众区块链共识等,各家都在积极探索区块链技术。
区块链定义:网络中一种分布式架构系统,通过密码学、共识算法、P2P对等网络交互,实现网络中去信任化的方式全节点集体维护一致可靠分布式账本技术架构。换种通俗的说法,区块链就是网络中各个参与者,都有一份相同可靠的数据副本,数据的写入需要网络中节点达成一种共识,和之前传统化中心机构来记录数据不同,它不依赖中心来记录数据。从区块链定义来理解,区块链保证了网络中数据的可靠,不依赖中心认证保证了信任的传递,这是目前对区块链技术价值普遍的认为。根据这些特性设想了众多应用场景:金融支付清算、数字身份、物联网、供应链、艺术版权等。
密码经常能够听到,密码学应用也极为广泛,简述密码学发展的三个阶段:
斯巴达人的塞塔式密码:把一个长条羊皮螺旋地斜着绕在一个多棱棒上,然后水平方向从左到右写字,写一个字绕一圈。这长条羊皮拿下来看上去杂乱无章的,但是加上同尺寸的多棱棒就能看到准确的信息了。
在古代中国,藏头诗,藏尾诗早就被那些文人墨客玩坏了,如水浒传中,拉卢员外下水的那首卦歌:芦花丛中一扁舟,俊杰俄从此地游。义士若能知此理,反躬难逃可无忧。之后又出现了一种古老的对称加密算法,凯撒算法,这类算法的基本实现原理是通过把字母移动一定的位数来实现加密和解密。明文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后被替换成密文,这种加密方式一旦掌握足够密文可以通过逆推的方式得到加密规则,但在当时这种理念还是很先进的。电影达芬奇密码中使用的密码道具。
古典密码学针对字符,对字符本身不做修改,通过位置的改变或者替换来隐藏信息,这种加密方式比较简单,主要通过工作或者机械的操作来加解密,一旦掌握了解密工具或者找到解密规律,信息马上就被破解了,整体安全性不高。
同时这也标志着密码学进入了第二阶段,现代计算机科学和信息技术的发展,之前对复杂计算的密码可以通过计算机来完成,密码学成为了一门科学。加密算法一般通过密钥来加解密,信息通过密钥加密后明文通过二进制的方式传播,一般的理解,你的密钥越长就越难破解,但是这个时候你会发现你的密钥只有一把,而且别人要解密你的信息,你必须把密钥也给对方,这种方式称为“对称加密算法”,你的密钥很关键,怎么保存,怎么传输就会很头疼。当然后来演变出来的哈希算法、公钥密码学、其实都是以现代密码学为基础。对称密钥原理图:
公钥密码学:1976年后,公钥密码学出现,这个也可以称为非对称加密,和之前的对称加密最大的区别就是,加解密分别使用公钥(publickey)和私钥(privatekey),密钥以一对的方式出现。196年W.Diffie和M.Hellman发表的New Direction in Cryptography,提出了非对称密码体制的概念。非对称密码体制一般依据两类类数学问题:大整数分解问题和离散对数问题。公钥密码学原理图:
加密算法概述
数据加密:数据加密的基本过程就是对原来为明文的文件或数据按某种算法进行处理,使其成为不可读的一段代码,通常称为“密文”,使其只能在输入相应的密钥之后才能显示出本来内容,通过这样的途径来达到保护数据不被非法人窃取、阅读的目的。该过程的逆过程为解密,即将该编码信息转化为其原来数据的过程。
那么根据数据加密的定义,我们会发现数据加密是需要一个解密过程中,那么有些算法在加密后变成密文,但是无法逆推的那种就不能被真正定义为加密算法。
解释下MD5的特点,MD5(MessageDigest Algorithm MD5),消息摘要算法第五版,这个消息摘要算法之前在讲数字签名时候也有涉及。MD5以512位分组来处理输入的信息,且每一分组又被划分为16个32位子分组,经过了一系列的处理后,算法的输出由四个32位分组组成,将这四个32位分组级联后将生成一个128位散列值。那么在计算开始就对信息进行了填充,并且压缩,最简单的例子,你在网络上下载东西是通过MD5验证,那么下载源何其多,但是MD5是128位,你可以计算MD5值的总数,无限对有限,这就是一个不可逆的过程,所以严格来说MD5就是一种算法而不是加密算法。
hash算法
hash算法也称为散列函数算法,在区块链中应用的相当频繁,在说明hash算法之前先明确一个概念。
计算机在底层机器码是采用二进制的模式,所谓二进制简单来说就是底层以0/1来标识,所有数据传输记录都以010101的模式来存储记录,两种状态也可认为就是一个日常生活中的开关,1标识开,0标识关。那么计算机中最小的数据单位也就是这里说的0或者1,这里我们称为bit(比特或者位),8个bit组成一个字节。当然计算机中也有八进制、十六进制的表示,这里暂时不展开讨论。只明确底层一个二进制的概念。
Hash算法广泛应用于计算机信息科学领域中,也是十分基础的密码学相关知识。
Hash表,也称散列表,学过计算机数据结构的都比较清楚这个概念。Hash表是根据关键码值(key、value)而进行直接访问的数据结构。把关键码值映射到表中中一个位置来访问记录。加快查找速度。这个映射的函数称为hash函数,存放记录的数组叫散列表。
先来看一个转换:touhezijindeyu经过各种hash加密后得到的值:
MD5加密:
5f1a4fc86d69f850bdd9d972a9b51011
SHA256加密:
b71718959b8a7673e8593bd6a21dc81eb5279e89fd4edc32d648ece57ed7056d
SHA512加密:
0264b0a70c46e7a05ba6fff156ff51738e0d39038fa662575e0a6603412c8c7119dba6aa76d294338a0156ee22cd10d379f5848b1a45a6027fdc5c47b0366198
Hash算法能把任意长度的二进制值映射为固定长度的二进制值,一般来说前一个二进制值我们成为明文,后面通过映射后得到的固定二进制值成为密文或者成为hash值。一旦在明文做任何修改,密文hash值就会有较大出入。
良好的hash算法需要满足: * 快速定向:输入明文后,hash函数能在有限的时间和资源下计算出hash值。 * 难以逆推:得到密文hash值后,在规定的时间内无法推导出明文(注意是规定时间内,这个理论上和实际还是有一些区别)。 * 明文修改异常:明文稍作修改,密文hash值会有较大出入。 * 避免冲突:不同明文,难以出现相同密文hash值。
Hash函数一个映像的关系组,那么理论上会出现,明文x不等于y,那么f(x)=f(y)的情况。避免出现不同明文出现相同hash值,这种称为抗碰撞性,也就是上文说到的解决冲突。
散列函数的值需要尽可能的平均,同时需要良好的处理冲突的方法,一般解决冲突的方法如下:
线性探查法:发生冲突后,线性向前去探索,找到一个附近的空位置。这种方法会导致出现堆积现象,那么在存取的时候,无法明确同义词,那么盲目探查序列,这种探查法比较线性,原理较为明了,但是整个执行效率就会受到较大影响。
双散列函数法:在位置冲突后,再次使用一次散列函数进行计算,使得探查序列跳跃式分布。
常用的构造散列函数的方法:
直接寻址法:直接取key或者key的某个线性函数值为散列地址,那么H(key)=key或者H(key)=a*key+b,a、b为参数。
数字分析法:分析一组数据,发现有冲突可能,那么假设冲突后的数字来构成散列地址,这种方式事先找出数字的规律,然后尽可能利用数据来构造冲突几率低的散列地址。
平方取中法:取keyword平方后的中间几位作为散列地址。
折叠法:keyword切割,分成位数相同的几组,当然最后一组可不同,然后这几组的叠加和作为散列地址。
随机数法:选择一组随机函数,取keyword得随机值作为散列地址。
除留余数法:取keyword,然后被某个不大于散列列表表长m的数除后得到余数为散列地址。公式:H(key) = key MOD p,p<=m。不仅能够对keyword直接取模,也可在折叠、平方取中等运算之后取模。
Hash函数分类:
加法hash:把输入的元素一个个加起来的到最终结果。
位运算hash:通过利用各种位运算,移位或者异或来混合输入元素。
乘法hash:利用乘法的不相关性。比如乘以一个固定或者不停变化的数。
除法hash:和乘法的不相关性类似,但是除法效率较慢,所以应用较少。
查表hash:CRC系列相关算法。
混合hash:通过混合上述5种方式。
Hash算法应用:
校验文件:上述CRC校验和奇偶校验算法,防止数据篡改,MD5算法,目前听到的较多的一种校验文件完整性算法。
数字签名:由于非对称算法的运算速度,在常用数字签名协议中,单向的散列函数都是比较常用的,对于hash值,又会称为“数字摘要”进行数字签名。
挑战-认证模式:一般用于信道传输过程中,防止侦听破坏的一种方式。
Hash函数使用限制:
Hash函数中,不论输入的文件长度多少,输出结果都是一组固定长度的数字字符,结合加密方法的概念,hash算法是一个不可逆向的单项函数。文件有任意改动,即可检测出来。同时hash算法是一个无限大范围映射到一个有限小范围的模式,那么节省空间同时便于查找。当然不是所有都适合hash算法,总结以下几个限制: hash函数是大范围映射到小范围,故实际输入考虑和小范围相当或者更小,理论上尽量避免冲突。 hash函数是单向不可逆。
对称加密:
对称加密的概念出现在密码学发展的第二阶段,最为广泛的美国DES(Data Encryption Standard)标准。目前很多金融机构还一直在使用这类型密码用于加密。对称加密算法中,发送方将明文和密钥经过算法转换后,通过密文发送给接收方,接收方通过相同的算法和密钥进行逆向解密,这种方式加密方式加解密过程中使用同一密钥。这需要双方事先都知道密钥。这种加密方式特点是算法公开、计算量小、加密和解密速度快,整个加密效率较高。但是由于密钥单一,故一旦密钥透露了,相应加密的密文也就暴露了。
对称加密中最为常见的DES及其衍生模式:
DES:DES(Data Encryption Standard):对称算法,数据加密标准,速度较快,适用于加密大量数据的场合。DES算法的入口参数有三个:Key、Data、Mode。其中Key为7个字节共56位,是DES算法的工作密钥;Data为8个字节64位,是要被加密或被解密的数据;Mode为DES的工作方式,有两种:加密或解密,密钥事实上是56位参与DES运算(第8、16、24、32、40、48、56、64位是校验位, 使得每个密钥都有奇数个1)分组后的明文组和56位的密钥按位替代或交换的方法形成密文组的加密方法。
3DES:3DES:使用3条56位的密钥对数据进行三次加密。是DES的一个更安全的变形。它以DES为基本模块,通过组合分组方法设计出分组加密算法。比起最初的DES,3DES更为安全。该方法使用两个密钥,执行三次DES算法,加密的过程是加密-解密-加密,解密的过程是解密-加密-解密。
AES:AES:高级加密标准(AES,Advanced Encryption Standard)为目前最常见的对称加密算法,加密解密使用密钥相同,一般配合非对称加密把密钥传输,然后通过加密函数E,C = E(K, P),其中P为明文,K为密钥,C为密文。解密函数D,P = D(K, C),其中C为密文,K为密钥,P为明文。微信中加密方式即参考这种模式。
非对称加密:
和之前的对称加密对比,非对称加密使用一对密钥,即公钥和私钥,自己保存私钥,公钥公开,允许在不安全的媒体上通讯双方交换信息,也成为公钥加密。非对称加密是现代密码学的重要突破,现在最为知名的就是RSA公钥加密算法。
RSA算法:
数学原理:
在说明RSA算法之前稍微了解下一些基本数学知识:
质数:prime number,又称为素数,在大于1的自然数中,除了1和其本身,没有其他因素,这种数就称为质数。(2.3.5.7.11.13.17.19,这是20以内的质数)
互质关系:coprime,两个正整数,除了1之外没有其他的公因子,这两个数就是互质关系。通过互质关系可以推导出几个原理:(p、q、n为正整数)
给定一个正整数n,那么小于n的正整数中,有多少个正整数和n构成互质关系。欧拉函数的证明过程比较复杂,这里简单说明几个定理:(n为正整数、p为质数、k为>1的正整数)
如果两个正整数a和n互质,那么一定可以找到整数b,使得 ab-1 被n整除,或者说ab被n除的余数是1。这时,b就叫做a的“模反元素”。
例:3和11互质,那么3的模反元素就是4,因为 (3 × 4)-1 可以被11整除。显然,模反元素不止一个, 4加减11的整数倍都是3的模反元素 {...,-18,-7,4,15,26,...},即如果b是a的模反元素,则 b+kn 都是a的模反元素。欧拉定义可以用来证明模反元素的存在性:
RSA算法简介:
RSA算法是一种非对称密码算法,所谓非对称,就是指该算法需要一对密钥,使用其中一个加密,则需要用另一个才能解密。RSA的算法涉及三个参数,n、e1、e2。其中,n是两个大质数p、q的积,n的二进制表示时所占用的位数,就是所谓的密钥长度。e1和e2是一对相关的值,e1可以任意取,但要求e1与(p-1)*(q-1)互质;再选择e2,要求(e2*e1)mod((p-1)*(q-1))=1。(n,e1),(n,e2)就是密钥对。其中(n,e1)为公钥,(n,e2)为私钥。RSA加解密的算法完全相同,设A为明文,B为密文,则:A=B^e2 mod n;B=A^e1 mod n;(公钥加密体制中,一般用公钥加密,私钥解密)e1和e2可以互换使用,即:A=B^e1 mod n;B=A^e2 mod n。
例:通过一个加解密过程来说明:
A和B两个加解密交互,A首先选择一对质数,因为是举例所以选择数比较小,实际中根据质数位数,安全性有相应的提升,一般小位的RSA算法已可通过暴力破解来解密,所以实际应用中位数选择也是很重要的,根据位数来设置安全权限等级高低。
A选择一对质数,x、y,然后将x*y=z,把z写成二进制表达(二进制位数决定安全性高低)。
根据欧拉函数计算,p=(x-1)*(y-1)
随机选择一个整数q,1
结合模反元素计算d的值,ed ≡ 1 (mod φ(n))--ed - 1 = kφ(n)--ex + φ(n)y = 1(推导计算),实际就理解q*x+p*y=1。(欧几里得算法)
刚刚计算的那些值:z、p、q、d,封装下(z、q)公钥,(z、d)私钥。
上面就是整个公钥和私钥的生成。任何算法都要考虑他的逆推时候会可行。
私钥中的d是关键的数字,那么已知(z、q)推导d,由于q是随机选择的,z又和私钥相关,可知z能否逆推变得很重要。分析下z:
z因数分解(把一个整数分解成两个或更多的除1外的整数相乘的过程),我们假设一个16:(2-8、2-2-4、4-4等),那么你选择一个4位数或者8位数,测试下能计算出多少种可能,再结合现实场景一个16位以上乘以16位以上,你再计算他的因数分解。这个难度值还是比较高的。
结合加解密过程再说明:
首先是加密,选择一个数字加密,数字为m 那么加密:m的q次方=加密后值(mod z)。解密,加密后的值的d次方=m(mod z),解密后m和之前m一致。
数字签名
随着互联网的发展,网络交易普及,在交易过程中经常会碰到数字签名这个概念,当然区块链中也通过数字签名来验证交易信息的可靠性,这里简单介绍下数字签名的概念,如有理解不当的地方,请及时指正。
签名:在现实社会中,签名作为签名者身份的一种证明,签名代表对签名文件的认可,不可抵赖。理论上签名是可信、不可伪造的。每次你刷卡消费后,营业员肯定需要你对回执上进行签名,这就是一种对消费交易的认可。
数字签名(又称公钥数字签名、电子签章):是一种类似写在纸上的普通的物理签名,但是使用了公钥加密领域的技术实现,用于鉴别数字信息的方法。一套数字签名通常定义两种互补的运算,一个用于签名,另一个用于验证。就是只有信息的发送者才能产生的别人无法伪造的一段数字串,这段数字串同时也是对信息的发送者发送信息真实性的一个有效证明。简单证明“我就是我”。
和传统的签名不一样,互联网的发展和数字签名的出现,让签名认证这个概念应用到了更多的层面。
1.签名认证,数字签名在网络交易上和实际签名一样的认可功能,不可抵赖,签名放拥有私钥,保证签名只能自己操作,在出现签名的环境下,使用私钥验证签名的真伪。
2.防篡改,这个通过网络下载来说明最为直观,你在网络上下载一个文件,数字签名和文件混合一个整体数据包,通过对数字签名的验证,保证文件在传输过程中未被篡改。
3.验证数据的完整性,如2同理,如果文件有丢失,签名将不完整,解开数字签名和之前的比较就会出现不一致。保证文件的完整。
4.仲裁机制,数字签名也可以认为是一个数字身份,通过唯一私钥生成,在网络上交易互动时要求收到一个数字签名的回文,保证过程的完整。如果对交互过程出现抵赖,那么用数字便于仲裁。
5.保密性,对于有安全级别要求文件,数字签名加密后传输,保证数据在被中途截取后无法获得其真实内容。有利于数据的安全性。
6.防重放:在数字签名中,如果采用了对签名报文添加流水号、时戳等技术,可以防止重放攻击。
7.多重数字签名,通过多次数字签名,对文件数据进行多人认证。
数字签名整个过程验证简单,只需要公钥、私钥进行加解密的验证,和传统签名不一致,一般都会看到电视剧中常出现签名验证的时候需要专业的笔记签证专家,采用数字签名节省了验证流程和成本。
从数字签名过程来简单理解下原理。
所谓数字签名就是附加在数据单元上的一些数据,或是对数据单元所作的密码变换。这种数据或变换允许数据单元的接收者用以确认数据单元的来源和数据单元的完整性并保护数据,防止被人(例如接收者)进行伪造。它是对电子形式的消息进行签名的一种方法,一个签名消息能在一个通信网络中传输。
1.一段需发送的数据经过hash计算生成一份摘要。
2.摘要通过发送者私钥进行加密。
3.发送者将使用私钥加密后的摘要和报文,生成一段待发送的数据包。数字签名即为经过私钥加密后的加密摘要。
4.接收者使用之前一样的hash算法对报文计算摘要。
5.接收者再通过发送者公钥对摘要进行加密计算D。
6.接收者通过发送者公钥对数字签名进行解密D’。
7.两者进行比较即可验证。
实现数字签名有很多方法,数字签名采用较多的是公钥加密方式,如基于RSA Date Security 公司的PKCS(Public Key Cryptography Standards)、Digital Signature Algorithm、x.509、PGP(Pretty Good Privacy)。1994年美国标准与技术协会公布了数字签名标准而使公钥加密技术广泛应用。公钥加密系统采用的是非对称加密算法。之前的文章对非对称加密也有过说明,有兴趣可以参考。它的主要方式是,报文的发送方从报文文本中生成一个128位的散列值(或报文摘要)。发送方用自己的私人密钥对这个散列值进行加密来形成发送方的数字签名。然后,这个数字签名将作为报文的附件和报文一起发送给报文的接收方。报文的接收方首先从接收到的原始报文中计算出128位的散列值(或报文摘要),接着再用发送方的公用密钥来对报文附加的数字签名进行解密。如果两个散列值相同、那么接收方就能确认该数字签名是发送方的。通过数字签名能够实现对原始报文的鉴别。上文数字签名步骤解释的也就是一种公钥加密签名的模式。当然还有对称加密方式,现在常用为非对称加密算法。
结合区块链技术看下公钥、私钥、地址、签名的概念。(比特币为例)
上图是公钥、私钥、地址的生成过程,有了这三个要素,然后通过上述数字签名的从过程发送信息摘要和数字签名,验证一致性。区块链中目前用到的是椭圆曲线算法。
椭圆曲线算法:椭圆曲线算法ECC来做非对称加密基础算法。ECC的210位算法难度就相当于RSA 2048的难度,性能则是数量级的区别。这里涉及到一些专业的数学知识点,椭圆算法ECC其实就是利用乘法容易,而除法难的特点,设计一个乘法:K = k * G,其中大K是公钥,小k是私钥,G是生成点。由私钥推导公钥很容易,只需要k个G相加即可。但是从公钥推导私钥很难,也就是无法计算公钥K除以G。如果有兴趣可以参考下文:
http://rdc.hundsun.com/portal/article/750.html
梅克尔树
Merkle tree中文叫做梅克尔树,这当然不是一棵真正的植物树,merkle tree是计算机数据结构中的一种树,是由计算机科学家 Ralph Merkle 提出的,并以他本人的名字来命名。
Merkle tree是数据结构中的一种树结构,可以是二叉树,也可以是多叉树,他和数据结构中树的特点几乎一致,和普通树不同的是:merkle tree上的叶节点存放hash计算后的hash值,非叶节点是其对应的子节点串联的字符串的hash值。上图可知:hash0=hash0-0+hash0-1。中本聪在比特币系统中很好的运用了merkle tree树,现在的以太坊也使用该模式来做区块链系统中的验证互联。
在具体介绍merkle tree之前先明确两个概念:
HASH:hash运算一直出现在区块链的介绍文章中,这个技术其实在互联网中一直被广泛应用,一段数据经过hash运算后生成一段密文哈希值,在网络环境中把这个hash值作为一段数据校验,我们在网络上下载文件的时候,把数据文件下载到本地,然后运算hash,如果和之前的hash值一致,那么就说明这个下载文件在网络传输下载过程中并没有损坏和篡改,保证数据一致。Hash算法保证了,一旦黑客或者恶意操作的人对源头数据作任何一点点的修改就会导致整个hash值会出现较大不一样。从而使用这种方式验证数据完整性和安全性还是十分有效的。
HASH LIST:结合上图hash算法后,一组数据生成一组hash值。在我们常用的P2P下载软件中,数据通过网络中点对点的方式传输,很多人认为在传输过程中只是一个文件,事实上很多数据文件都会进行一个切割,然后生成一个hash list,一个数据被分割后传输,一旦出现一个或者多个数据被篡改,那么结合hash list就可验证那几个数据块是有问题的,即可选择有问题的数据块重新下载即可。这里涌入一个hash root的概念,在区块链中有merkle hash root值。这个数据值就是拼凑在一起的hash值,通过hash root,我们可以通过事先获知hash root,然后结合hash list计算,逐步校验每一块的hash值并进行组合,组合值和hash root比较,一致就说明数据块是没有问题的,这种方式更好的运用在实际的网络数据传输中。
Merkle Tree:之前的hash list中如果深入思考下,在网络传输中分切很多数据块后,你获得了正确的hash root,那么你必须要获得素有的块hash值才能去组合计算,并和正确的hash root比较,那么这样会导致整个效率问题。Merkle tree的机制就是通过树结构,不需要全部获取块hash值,也可验证。大致说明下原理:
这是一个merkle tree,根节点为root值,hash7+hash8生成hash3,hash3+hash4生成hash1。以此类推。简单结合实际网络中应用。Hash(7...14)是一个数据的切块hash值,每一对值生成上一层的hash,也就是hash(3...6),然后生成hash1和hash2,最后hash1+hash2结合后生成merkle root。这种方式在网络中验证恶意或者篡改数据块,事前先有准备的merkle root,这里假设7是恶意节点:
首先比对 merkle tree root,发现不一致。
比对:hash1和hash2,那么可以得知hash2一致,hash1不一致。
比对:hash3和hash4,那么可以得知hash4一致,hash3不一致。
比对:hash7和hash8,那么hash7不一致。
在验证恶意节点的时候,上面举例红色节点和hash2,经过这些验证即可,那么hash7很快就被找出来了,这种检索的效率理论上为:Log(N) 。
结合区块链,在比特币系统的使用就是merkle tree root证明,了解比特币的知道,区块链中的区块分为区块头和区块数据。区块头中:上一区块头的hash值、时间戳、难度值、nonce、merkle tree root值。结合笔者前文SPV认证。可以让节点只下载区块头,然后通过merkle tree原理做支付验证。
在以太坊中,一个区块头中,包含三个merkle tree(帕特里夏树),分为交易、收据(receipts)、状态。三种状态树支持以下查询操作:这笔交易是否包含在特定的区块中,查询某地址在过去一段时间内,发出某类型事件的所有实例,当前余额,账户真实存在性,合约的假设性运行结果模拟。