四. 区块链系统的核心之二-加密技术

区块链系统的核心之二-加密技术

         加密技术主要是用来解决区块链系统记录的数据的所有权问题。

1哈希算法

1)哈希算法简介

        哈希算法是一种加密算法,是区块链系统最根本的技术基础之一。哈希能够实现数据从一个维度向另一个维度的映射,通常使用哈希函数实现这种映射。在数学用Y = hash(X)的方式进行表示,其中X代表要进行哈希运算的数据,hash()代表哈希函数,Y代表哈希函数通过对X进行哈希运算而得到的哈希值。

        哈希算法数就是基于通过特定哈希函数的不断重复"压缩"输入的一组组数据和前一次压缩处理的结果的过程,直到全部数据都被压缩完毕,最后的输出作为整个消息的哈希值。虽然到目前为止,还没有严格的理论证明,但绝大多数学者认为,如果哈希函数是安全的,那么以上述任意长度的消息也将是安全的。

        首先,任意长度的消息被分拆成符合压哈希函数输入要求的数据分组,若长度不够,最后一个分组可能需要在末尾添上特定的填充字节。然后,这些数据分组将被顺序处理,除了第一个数据分组将与初始化值一起作为哈希函数的输入外,当前分组将和前一个分组的哈希函数输出一起被作为这一次压缩的输入,而其输出又将被作为下一个分组哈希函数输入的一部分,直到最后一个哈希函数的输出,将被作为整个消息散列的哈希值。

2)哈希算法的特性

        (1) 广泛性:参数可以为各种类型的,任意长短的,代表各种原始信息的分散数列。

        (2) 等长性:无论作为输入参数的原始信息有多长或多短,其计算后而得到的输出结果(哈希值)都具有固定的长度。

        (3) 确定性:任何一个不同的作为输入参数的原始信息经计算后而得到的输出结果(哈希值)都是不同的和唯一的。

        (4) 单向性:通过输入参数计算哈希值非常容易且快速, 通过哈希值计算还原出原始输入的参数是不可能的。

        (5) 无碰撞性:不同的作为输入参数的原始信息经计算后而得到的输出结果(哈希值)理论上会有相同的,但是现实中是无法找到的。

3)哈希算法的应用

(1) 文件验证

         实践中一般应用比较多的验证算法有奇偶验证和CRC验证。奇偶验证和CRC验证能够在一定程度上检测并纠正数据传输中的信道误码,但是却但却没有防治被验证的数据被篡改的能力,也就是不能防止对数据的恶意破坏。

        目前应用最广泛的一种文件完整性验证MD5哈希算法。该哈希算法能够形成数字签名,非常便于对文件甚至系统进行安全性验证。下面是两种常用的情况:

        第一,传输文件的验证:

        收到文件方将收到的传输文件进行MD5 checksum计算,然后将计算结果与源文件的MD5 checksum 进行比对,如果两者的MD5 checksum 是一致性,可以证明两个文件的每一个代码也是完全相同的。这样就可以检验文件传输过程中是否出现错误或者被恶意篡改过。在互联网的文传协议方面广泛应用着,用以保证文件用户下载的文件的正确性(如镜像站点下载,间断下载)。当然整个的验证过程还是很繁琐的。

        哈希算法对于同样的问题的解决方法是最好的。其只要求文件的传输者在传输文件的同时,也传输对该文件进行哈希计算用传输者的代码签名密钥进行数字签名的值,及传输者的代码签名证书。文件的接受者不仅能验证文件的完整性,还可以依据接受者自己对证书签发者和证书拥有者的信任程度,决定是否接受该文件。

        第二,系统文件的验证:

        不少系统安全管理软件都提供对文件系统完整性评估的功能,在系统初始安装完毕后,建立对文件系统的基础校验和数据库,因为散列校验和的长度很小,它们可以方便的被存放在容量很小的存储介质上。此后,可以定期或根据需要,再次计算文件系统的校验和,一旦发现与原来保存的值有不匹配,说明该文件已经被非法修改,或者是被病毒感染,或者被木马程序替代。

        哈希算法的信息验真代码提供了更好的解决办法。其原理就是必须拥有对应的密钥才能检验某一哈希值。文件系统的数字指纹也许会被保存在任何文件系统,只对拥有对应的密钥才能对文件系统的可靠性提供鉴别。同时也意味着,文件的数字指纹如果需要被修改,只有密钥的拥有者可以计算出新的哈希值,而企图破坏文件完整性者却无法得到这个哈希值。

         区块链系统中的区块的链的结构和merkle树就是哈希算法的应用。

         区块的链的结构是由创世区块(第一个区块)向后通过区块之间的指针进行连接,这个指针使用的就是哈希指针.每个区块中都存储了前一个区块的哈希指针。这样的数据结构的好处在于后面区块可以查找前面所有区块中的信息且区块的哈希指针的计算包含了前面区块的信息,从而一定程度上保证了区块链的不易篡改的特性。

         merkle树是数据结构中的一种树状结构,可以是二叉树,也可以是多叉树,他和数据结构中树状结构的特点几乎一致,和普通树状结构不同的是:merkle树上的叶节点存放的是哈希计算后的哈希值,非叶节点是其对应的子节点串联的字符串的哈希值。merkle树被用于对区块头的确认。

(2) 数字签名

         数据文件发送方和接收方事先协商好双方都支持的Hash函数和签名算法。发送方先对该数据文件进行哈希计算得到哈希值。然后再对很短的哈希值(对于Md5来说是16个字节,对于SHA1来说是20字节,而对于区块链应用的SHA256来说是64字节)用非对称算法进行数字签名操作。对方在验证签名时,也是先对该数据文件进行哈希计算其哈希值,然后再用非对称算法验证数字签名。

        对哈希值进行数字签名,被认为与对文件本身进行数字签名是等效的且有如下的优点:

        第一,数据文件本身可以同它的哈希值分开保存,签名验证也可以脱离数据文件本身的存在而进行。

        第二,有些情况下签名密钥可能与解密密钥是同一个,也就是说,如果对一个数据文件签名,与对其进行非对称的解密操作是相同的是非常危险的,恶意的破坏者可能将一个试图骗你将其解密的文件,充当一个要求你签名的文件发送给你。因此,在对任何数据文件进行数字签名时,只有对其Ha哈希值进行签名才是安全的。

        区块链系统中节点的地址、公钥、私钥的计算大量应用了哈希算法。节点的地址计算过程是,先对公钥(计算过程在非对称加密算法部分介绍)经过一次SHA256计算,再进行一次RIPEMD160计算,得到一个公钥哈希(20字节),添加版本后信息,再来两次SHA256运算、取前4比特字节,放到哈希公钥加版本信息后,再经过base58编码,最终得到节点的地址。

(3) 所有权鉴定

        需要鉴权的一方,向将被鉴权的一方发送随机值,被鉴权方将该随机值和自己的鉴权口令一起进行哈希运算后,将所得哈希值返还给鉴权方,鉴权方将收到的哈希值与在自己一方用收到的哈希值和被鉴权方的鉴权口令进行哈希运算的结果相比较。如相同,则可在认为对方拥有该口令,即通过证明被鉴权的一方具有所有权。

4)哈希算法的种类

(1)哈希算法的一般种类

        哈希(SHA)系列算法是美国国家安全局(NSA)设计的,美国国家标准与技术研究院 (NIST) 发布的一系列哈希函数。到目前为止,SHA系列算法经历了SHA-0,SHA-1,SHA-2,SHA-3系列发展。

        SHA不是指一个算法,而是指一个哈希函数集。其中SHA-2包括有sha-224、sha-256、sha-384、sha-512等哈希算法。在09年中本聪设计比特币的时候,当时sha-256被认为最安全的算法之一,故选择了sha-256,sha-256到目前为止还没有被破解。

       2007年NSA正式宣布在全球范围内征集新新一代(SHA-3)算法设计,2012年公布评选结果, Keccak算法最终获胜成为唯一官方标准SHA-3算法,但还有四种算法同时进入了第三轮评选,分别是:BLAKE, GrøSTL, JH和SKEIN,这些算法其实也非常安全,而且经受审查,也有许多应用的实例。

(2)哈希算法的组合算法

        除了上述提到的各个SHA哈希算法,有人还将各种算法进行了一些组合而形成了新的哈希算法,并应用于实践中。这里简单介绍两种:

        第一,串联算法

        2013年7月,夸克币(Quark)发布,首创使用多轮哈希算法。其对输入数据依次进行了9次哈希函数运算,前一轮运算结果作为后一轮运算的输入。这9轮哈希函数运算共使用6种加密算法,分别为BLAKE, BMW, GROESTL, JH, KECCAK和SKEIN。

       这种多轮哈希函数运算给人直观上感觉很安全很强大的感觉,非常受追捧。很快达世币(前身是暗黑币)就采用了串联算法,并发扬光大之。达世币率先使用11种加密算法(BLAKE, BMW, GROESTL, JH, KECCAK, SKEIN, LUFFA, CUBEHASH, SHAVITE, SIMD, ECHO),并称之为X11.不久X13,X15等等也被不断的开发出来了。

        事实上,对于串联算法来说,安全性并没有提高。其所串联的各个算法只要其中有一种算法被破解,整个算法就被破解了。

        第二,并联算法

        相对于算法的串联,俄罗斯人Heavycoin(HVC)率先做了尝试算法的并联,创造了HVC算法。HVC算法的细节如下:

        首先,对输入数据首先运行一次HEFTY1(一种Hash算法)运算,得到结果d1。

        然后,以d1为输入,依次进行SHA256、KECCAK512、GROESTL512、BLAKE512运算,分别获得输出d2,d3,d4和d5。

       最后,分别提取d2-d5前64位,混淆后形成最终的256位Hash结果,作为区块的哈希值。

        该算法首先进行了运算起来极其困难的HEFTY1哈希运算(来加强去中心化,但是安全性没有得到某个官方机构论证)。然后,通过加入四种安全性已经得到公认的哈希算法增强安全性。HVC从以上每种算法提取64位,经过融合成为最后的结果,实际上是将四种算法并联在一起,其中一种算法被破解只会危及其中64位,四中算法同时被破解才会危及货币系统的安全性。

        随着技术的发展,哈希算法必然不断的更新换代。而每一次的更新换代都会引起可怕的区块链硬分叉(一条区块链因分歧而分裂成两台区块链)。如果使用并联算法,就有可能比较平静的解决硬分叉过渡问题。所以,并联算法非常具有研究意义。

5)哈希算法的安全性

        目前区块链系统采用的是SHA256算法。该算法属于SHA-2系列。在第一个区块链系统创立时(2008)SHA256算法被公认为是最安全最先进的算法之一。区块链系统中除了生成节点地址中有一个环节使用了REPID-160算法,系统中但凡有需要做Hash运算的地方都是用SHA256。区块链系统经历了九年多的运行,安全上并没有出现问题。但是,对于SHA256是否有漏洞事实上是有不同声音的。

        2013年9月10日美国约翰霍普金斯大学的计算机科学助理教授,知名的加密算法专家,Matthew Green被NSA要求删除他的一份关于破解加密算法的与NSA有关的博客。同时约翰霍普金斯大学服务器上的该博客镜像也被要求删除。事后约翰霍普金斯大学称从未收到来自NSA的要求要删除博客或镜像的资料,但人们却无法在原网址再找到该博客。然而,从谷歌的缓存仍然可以找到该博客。该博客提到NSA每年花费2.5亿美元来为自己在解密信息方面获取优势,并列举了NSA的一系列见不得人的做法。

        一些认为哈希算法不安全的人士观点是:

        NSA制造了sha-2,他们不可能不留后门。斯诺登的棱镜事件已经明白的告诉人们,美国政府会用一切可能的手段来进行监视与解密。虽然有很多人会研究SHA-2,且目前没有公开的证据表明有漏洞。但没有公开这并不能代表就没有,因为发现漏洞的人也有可能保留这个秘密来自己利用,而不是公布。

        而认为安全的人士观点是:

        SHA-2是应用广泛的算法,应该已经经历了实践的检验。中国和俄国都有很多杰出的数学家,如果SHA-2有安全问题的话,这些数学家肯定已经发现了。

2 Merkle树

1) Merkle树介绍

        Merkle树是一类基于哈希值的二叉树或多叉树,其叶子节点上的值通常为数据块的哈希值,而非叶子节点上的值,是将该节点的所有子节点的组合结果的哈希值。Merkle树可以用来进行完整性验证处理。在处理完整性验证的应用过程中,Merkle树会大大减少数据的传输量及验证计算的复杂度。Merkle树目前在区块链,BitTorrent下载,Amazon Dynamo 副本同步,GIT版本控制上应用。

2) Merkle树实现原理

         第一,对每一个数值进行哈希运算,得到对应的哈希指针,然后作为叶子节点。

         第二, 非叶子节点value的计算方法:将该节点的所有子节点哈希值进行组合(例如拼接),然后对组合结果进行哈希计算所得出的哈希值就是该非也子节点的哈希值。

        第三,继续一直进行上述的两两计算,直到最后得到Merkle树根的哈希值。

        第四,经过上述过程得到的二叉树就是merkle树。

        从构建过程可知,merkle树是一颗完全二叉树或者是满二叉树。通常这类树构造的数据结构,其查询速度比较快,例如我们通常知晓的head堆,就是完全二叉树。在最低一层是我们的N块数据(通常可以把一个大块数据或文件截成N份)然后用哈希函数对数据进行哈希运算,得到的N个256位的哈希值。按照merkle树的构建过程,我们最终应该得哈希值总数为:M = 2N  或M = 2N – 1

        如果Merkle树的任何一块数据变更了,对应的merkle树就需要重建。在网络传输中,通过分段传输可以提高数据的传输效率,再通过merkle树验正,可以很快的确定数据是否被修改过。

        Merkle树可以用在分布式环境下的文件同步应用广泛。分布式系统的多节点数据一致性的校验,可以大大提高校验速度。

3) 应用Merkle树进行数据校验

        在获取到传输过来的N个数据块后,接收方可以用收到的数据构建出整个merkle树,并进行哈希运算得到哈希值。用哈希值同传递过来的merkle树的hash值进行比较,就可以确认数据是否被修改过,可以确定那个值被修改过,其大概过程如下:

         首先,比较根的哈希值是否相同,如果根的哈希值不同,检索根的上两个节点(比如,节点1和节点2)。

         然后,比较节点1和节点2)的哈希值。如果节点1的哈希值相同,节点2的哈希值不同。检索节点2的上两个节点(比如,节点5和节点6)。

        接着,比较节点5和节点6)的哈希值。如果节点5的哈希值不同,节点6的哈希值相同。检索节点5的上两个节点(比如,节点11和节点12)。

        最后,再比较节点11和节点12)的哈希值。如果节点11的哈希值不同,节点12的哈希值相同。而节点11为数据值而不是哈希值,就可以确定节点11的数据块是被篡改了的数据块。

        整个校验过程的次数是:次数 = 树的高度。 也就是:次数 = 「log2M」+1。  M是节点数。

4) Merkle树的节点的更新,删除,新增

        Merkle树除了用于数据检索,还可以进行节点的更新,删除,新增等。对于merkle树,更新相对比较简单,只需要更新对应数据块和哈希值就行了。对于Merkle树的删除和新增,和常规的二叉树的操作一样操作,删除和新增的同时也需要重建部分哈希树的节点的和哈希树根的哈希值。

        根据Merkle树具有校验快,可实现分布式校验,计算量低等优点,其广泛应用于区块链系统技术中。在区块链系统中,作为区块的校验机制,同时加上时间戳机制,保证了区块的链的顺序。只要有任何一个修改,整个区块链都要相应的进行修改。而在基于共识机制,这种修改成本巨大无比,是不可能做到的。

3 非对称加密算法

1)加密算法

        加密简单而言就是通过一种算法手段将对原始信息进行转换,信息的接收者能够通过秘钥对密文进行解密从而得到原文的过程。按照加密方和解密方秘钥相同与否可以将加密算法大致分为三种类型:

(1)对称加密

        对称加密的加密解密方使用相同的秘钥,这种方式的好处在于加解密的速度快但是秘钥的安全分发比较困难,常见对称加密算法有DES,AES,...

(2)非对称加密

        非对称加密体系也称为公钥体系,加解密时加密方拥有公钥和私钥,加密方可以将公钥发送给其他相关方,私钥严格自己保留。例如银行的颁发给个人用户的私钥就存储在个人的U盾里;非对称加密中可以通过私钥加密,他人能够使用公钥进行解密,反之亦然;非对称加密算法一般比较复杂执行时间相对对称加密较长;好处在于无秘钥分发问题。常见的其他非对称加密算法有RSA,ECC,区块链中主要使用ECC椭圆曲线算法。

(3)对称加密与非对称加密的结合

        这种方式将加密过程分为两个阶段,阶段一使用非对称加密进行秘钥的分发使得对方安全地得到对称加密的秘钥,阶段二使用对称加密对原文进行加解密。

2)区块链系统的加密算法

        区块链系统采用了非对称加密算法。非对称加密算法一般划分为三类主要方式:

     (1)大整数分解问题类指用两个较大的质数的乘积作为加密数,由于质数的出现具有不规律性,寻找破解只能通过不断的试算。

     (2)离散对数问题类指的是基于离散对数的难解性,利用强的单向散列函数的一种非对称分布式加密算法。

     (3)椭圆曲线类指利用平面椭圆曲线来计算成组非对称特殊值。椭圆曲线加密算法是基于椭圆曲线离散对数问题的复杂难解性。椭圆曲线离散对数问题远远难于传统的离散对数问题。基于椭圆曲线离散对数问题的加密算法的安全性也相应的远远高于传统的离散对数系统。区块链系统具体就是使用了此类加密算法。这个算法很复杂,在这里就不详细介绍了。

3)非对称加密算法在区块链系统的应用

       非对称加密算法在区块链系统的应用主要包括信息加密、数字签名和登录认证:

      (1)信息加密主要是由信息发送者使用接受者的公钥对信息加密后再发送给接受者,接受者利用自己的私钥对信息解密。比特币交易的加密即属于此场景。

     (2)数字签名则是由发送者采用自己的私钥加密信息后发送给接受者,接受者使用发送者的公钥对信息解密、从而可确保信息是由发送者发送的。数字签名类似于写在纸上的物理签名。数字签名主要用于数据更改的签名者身份识别以及抗抵赖。

        数字签名包含三个重要特性:

       第一,只有自己可以签署自己的数字签名,但是他人可以验证签名是否是你签发。

       第二,数字签名需要和具体的数字文档绑定,就好比现实中你的签名应该和纸质媒介绑定。

       第三,数字签名不可伪造。

        数字签名的过程是:

        首先调用操作系统底层的随机数生成器来生成256位随机数作为成个人的私钥(sk),由私钥首先经过Secp256k1椭圆曲线算法生成65字节长度的随机数的公钥(pk),形成一个公私钥对:(sk, pk) := 随机数生成方程式(钥大小参数)。私钥和公钥是先对应的,通过一把私钥可以推导出对应的唯一公钥;而通过一把公钥却无法推导出对应的私钥。私钥用户自己保留,公钥可以分发给其他人。

        然后,通过私钥对一个具体的数据进行签名:数字签名:= 数字签名方程式(sk, 数据) 这样就得到了一个具体的数字签名。

        最后,拥有该签名公钥的一方能够进行签名的验证:验证结果:= 验证方程式(pk, 数据, 数字签名)

        在区块链体系中每一条数据交易都需要数字签名,在比特币的设计过程中直接将用户的公钥来表征用户的地址。这样在用户发起交易时可以方便的进行用户交易的合法性验证。

        登录认证是由客户端使用私钥加密登录信息后发送给服务器,后者接收后采用该客户端的公 钥解密并认证登录信息.

        我们可以看出,从信任的角度来看,区块链实际上是数学方法解决信任问题的产物。过去,人们解决信任问题可能依靠个人的信任和社会信任评估机构提供的信任指标。而区块链系统技术中,所有的规则事先都以算法程序的形式表述出来,人们完全不需要知道交易的对手的信任状况,更不需要求助中心化的第三方机构来进行交易背书,而只需要信任数学算法就可以建立互信。区块链技术的背后,实质上是算法在为人们创造信用,达成共识背书。其本质上是一种更加客观的信用,是对现有社会信用体系的丰富和发展。

推荐阅读更多精彩内容