优得学院第四课:区块链中的密码学
这一节将学习区块链的技术之一密码学。这一讲,我们将从以下六个方面展开,首先我们来看一下区块链和密码学的关系在通常的区块链的定义中一般都有关于密码学的描述,比如在《中国区块链技术和应用发展白皮书2016》中关于区块链定义的描述中,“通过密码学的机制来确保交易无法被抵押和破坏,并尽量保护用户信息和记录的隐私性。”那么这一句话简单的说就是要抗抵赖和隐私保护表现在以下三个方面:
1、怎么防止交易记录被篡改?
2、怎么证明交易双方的身份?
3、怎么保护交易双方的隐私?
那么用三个词来表述就是如何确保交易信息的完整性,真实性和隐私性。
现代密码学的发展为解决这些问题提供了不少手段,传统的方案包括哈希函数,加解密算法,数字证书与数字签名,公钥体系,Merkle树等,那么在这一讲中,我们一起来学习区块链相关的密码学知识,为后续相关内容学习奠定好基础。
二、哈希函数
首先,我们来了解一下哈希函数,什么是哈希函数?我们说哈希函数是密码学的一个重要分支,是一类非常基础也非常重要的计算机算法。哈希函数将任意长度的输入变换为固定长度输出,且不可逆的单向密码体制。
例如用绿色颜色标出的这么一段话,那么计算出来,它的哈希值就是下面这么一段字符串,那么这就意味着对于某一个文件,我们不需要查看它的内容。只要它的sha256,这么个算法等下会介绍,利用这个算法计算出来的哈希值是这么一个字符串的话,那么则可以说明,文件,内容极大概率上就是我们绿色标记出来的这么一段话,这就是哈希函数。
哈希函数的主要用途非常的广泛,常见的一个是在数字签名,另外一类是消息认证,数字签名指的是验证信息来源的真实性,消息验证是验证消息的完整性,在区块链中,有两个比较常用的密码学哈希函数,一个是SHA256,另一个是RIPEMD160。
1、RIPEMD160、SHA256主要用于生成钱包地址,(关于钱包的定义会在后面的内容中介绍
到),用这两个哈希函数生成两个钱包地址主要是用来识别不同的用户;
2、SHA256也是构造区块链所用的主要哈希函数,无论是区块的头部信息还是交易数据,都用这个哈希函数去计算相关数据的哈希值,以保证数据的完整性;
3、SHA256的另一个主要用途是完成共识算法,一个典型的共识算法POW(工作量证明)计算。
大家应该都知道,这样一类共识算法的计算我们称作挖矿。这是关于哈希函数两类用的比较常见的,关于哈希函数的两类比较具体的应用在后续的相关内容里面也会详细的讲解,这里重点介绍哈希函数的特点。那么一个好的哈希函数,应该具有以下四个特点。
第一个特点是正向快速,指的是给定明文和哈希算法在有限的时间和有限的资源内,能够快速的计算出哈希值,这是第一个正向快速。
第二个特点是逆向困难,指的是给定若干哈希值,在有限的时间和有限的资源内在现有的算力内基本不可能推出明文,这就是指它的逆向困难。
第三个特点是输入敏感,指的是原始输入信息修改一点点,那么它产生的哈希值,看起来应该都有很大的不同,这就是输入很敏感,哪怕只有一位这样的变化,它的哈希值也有很大的差别。
第四个特别是冲突避免,指的是很难找到两段内容不同的明文,使得他们的哈希值一致,那么我们又称作发生冲突或者说碰撞,那么冲突避免有的时候我们又称为碰撞性,这里面有两类,一类是如果给定一个明文的前提下,无法找到另一个碰撞的明文,那么我们称作抗弱碰撞性,那么另外一类是指如果无法找到任意的两个明文使得他们发生碰撞,也就是使得这两个明文的哈希值一致,那么我们称这样的算法是抗强碰撞性。
这是我们刚才讲的一类好的哈希算法,它应该具有的这么四个特点。那么我们这里面简要的介绍,哈希函数一个非常重要的用途就是数字摘要,数字摘要又称作指纹。它是指对数字内容进行哈希运算,获取唯一的摘要值,来指代原始的数字内容。
那么数字摘要是解决确保内容没有被篡改过问题的重要手段(利用哈希函数的抗碰撞性特点)。我们大家都有这样的一个经验或者体会,我们在网络上面下载一个软件,或者一个文件的时候,有些网站往往会同时提供一个数字摘要值,我们把文件下载了以后,可以对这个原始文件,利用这个哈希函数进行计算得到它的摘要值,那么再与网站上提供的摘要值进行比对,如果一致,就可以确认这个内容没有被修改过。当然如果比对不一致,那么在下载的过程中间存在被篡改的可能。这是哈希函数非常重要的一个用途,数字摘要。这个我们在后面讲到签名的时候也会讲到这个摘要的。那么关于哈希函数就简要介绍这些内容。
三、加解密算法
加解密算法是密码学的核心技术,从设计理念上可以分为两大基本类型:一类叫做对称加密,另一类是非对称加密,那么我们这个表里面,从它的特点,优势,缺陷和代表算法对两类加解密算法进行了一个对比,当然我们这里面最大的一个差别是加解密秘钥是否相同,这是它们区分对称加密和非对称加密重要的一个区分点。
我们知道现代加解密系统,它的一个典型组建一般包括三个组建,一个是加解密算法,另外一个是加密密钥,第三个是解密密钥。在这三个解密密钥里面来讲的话,加解密算法自身是固定不变的,并且一般是公开可见,但是密钥则是这里面最关键的信息,需要安全的保存起来,甚至有的时候需要通过一些特殊的硬件来进行保护。
一般来说,对同一种算法,密钥需要按照特定算法每次加密前随机生成,长度越长,则加密强度越大。那么在加密的过程中,通过加密算法和加密密钥对明文进行加密获得密文,对应的在解密的过程中间,要通过解密算法和解密密钥对密文进行解密获取明文。
那么根据我们这个加解密过程中间所使用的密钥是否相同,我们可以分为对称加密和非对称加密两种,那么两种模式适用的是不同的需求,可以恰好形成一个互补,有的时候可以组合使用,形成一种混合的加密机制,接下来我们先看一下对称加密算法。
顾名思义对称加密算法指的是加密密钥和解密密钥是相同的,也就是说从这个图里面,我看的出来在加密的过程中间用的加密密钥,在解密的过程中见用的解密密钥实际上是同一个密钥。那么这一类算法它的特点是加解密的速度很快,空间占用小,保密强度很高,当然它的缺点也很明显,缺点就是说参与的多方需要持有密钥,一旦有人泄露,安全性就会破坏,这个大家应该看过一些谍战片,我们看到持有密钥的情报人员,一旦被抓获的话,整个是一个非常危险的事情,这里面还有一个缺点是如何分发一个密钥也是一个很重要的问题,就像刚才讲的谍战片里面,我们这个密钥通常都是密码本,密码本如何传递也是一个考验情报人员重要的一个问题。那么像这种对称加密算法主要适用于大量数据的加解密,一般不能用于签名场景。
那么针对这样一种对称加密算法和对称加密重要体制,这样存在一种问题就是刚才讲的安全的传送和保管密钥?无法实现抗抵赖的需求等…研究人员也做了大量的研究。
1976年,美国学者Diffie和Hellman发表了著名论文《密码学的新方向》,提出了非对称密码算法的思想,也就是“公开密钥密码体制”。
1978年,Rivest、Shamir和Adleman提出的RSA算法,也就是说以他们三个人的名字的首字母命名的这样一个算法,这个算法就很好的体现了公钥算法思想,并具有实用性。
公钥密码体制是现代密码学的一个标志,到目前为止,是密码学史上最大也是唯一真正的革命,可以说“没有公钥密码体制,就没有现代密码学”。公钥密码体制出现以后引起了密码界高度的关注,并得到了迅速的发展,尤其在信息安全的应用中,广泛的涉及到公钥密码技术,
那么公钥密码体制,也就是我们说的非对称加密算法,从这个名字上面我们就可以看的出来公钥和私钥是不同的,公钥一般是公开的,每个人都可以获取,私钥一般是个人自己持有不能被他人获取,那么这一类算法他的优点是公钥私钥是分开的,容易管理,并且容易完成密钥的分发,因为公钥可以分发出去,只要自己管理好私钥就可以了,那么当然他的缺点就是说,它的加解密速度比较慢。
因此对应来讲,这样一类算法,它一般适用于签名场景,或者说密钥协商,什么叫密钥协商,就是我们讲的说对称加密,如何传递密钥,如何协商密钥,我们就可以用这种非对称加密算法来完成。它不适合大量数据的加解密,那么,非对称加密算法很好的解决了这个密钥传输和密钥管理的问题 。是不是说它就是这样一个很安全的算法呢?那也并非这样的,事实上并非所有的加密算法的安全性都可以从数学上得到证明。公认的高强度的加密算法和实现往往都是要经过长时间充分的实践认证以后才被大家所认可。
但也不代表其绝对不存在漏洞,因此自行设计和发明未经过大规模验证的加密算法,是一种不太明智的行为,即便不公开算法的加密过程也很容易被攻破,在安全性上得到保障,实际上密码学实现的安全往往是通过算法所依赖的数学问题来提供,而并非通过对算法的实现过程进行保密来得到保障,这是关于加解密算法。
四、数字签名和数字证书
数字签名类似于在纸质合同上面来确认合同内容,它是用来证实某数字内容的完整性和来源。那么它的签名过程就是说签名者首先对这个我们要签名的这个消息进行处理,生成别人无法伪造的数字串,那么这一段数字串同时也是对消息的签名者发送消息的一个真实性的一个有效证明,那么利用数字签名这个技术,能够确保消息签名的完整性,发送者的身份认证,防止交易中的抵赖发生,这里举个例子:
A要发送B一个文件
A首先对文件有一个摘要,利用前面讲的哈希函数得到一个摘要,然后用自己的私钥对这个摘要进行一个加密,再将文件和加密串一起都发给B。那么B收到原始文件和加密串以后呢,首先要用A的公钥来解密加密串,得到原始的数字摘要,然后第二步做的是要对原始文件,利用哈希函数得到摘要,再把解密后的摘要和我们的这个摘要进行一个比对,如果一致,说明该文件确实是A发过来的,并且内容没有被修改过。
这是一个非常重要的一个应用,那么在比特币系统里面,比特币的拥有者,它就是用它的私钥给它的交易消息签名来证明消息的发布者,是相应比特币地址的所有者,那么如果没有这个私钥,这用户就不能给这个消息进行一个签名,就没办法证明这是比特币地址的拥有者,那么这个图更加形象的数字签名的过程给展现出来了。
我们再简单的看一下,这是原始文件通过哈希函数得到它的一个摘要,得到摘要以后,我们用这个私钥进行加密,得到一个加密串,那么在传输的过程中间,要把原始文件和加密串一起打包成,然后传递给接收者,接收者收到原始文件和加密串以后,发送者的公钥对这个加密串进行解密,得到解密后的字符串,然后对原始文件利用同样的哈希函数获取摘要,然后对两者进行一个比对。
如果一致的话,这个消息确实是正确的发送者发送过来的,同时内容在传输的过程中没有被篡改,这就是数字签名的过程,那么数字签名主要是通过单签名,多重签名,群签名,环签名,这里面我们要重点介绍一下多重签名,多重签名就是说多个密钥来授权一般比特币的交易,我们是以比特币交易为例,它通常用来界定加密货币的所有权,那么在传统的比特币账户中,用户的比特币地址中,每一个地址都有一个对应的私钥,这一类就可以称为单签名交易,因为转账只需要一个签名,什么签名呢?
就是这个比特币地址相关的私钥的拥有者他的签名就可以了,那么当然像这种单一的签名,它的安全性是不够高的,所以我们经常会采用这种多重签名,可以用多个比如三个相关的私钥,那么用户通常需要其中的两个以上的才能完成一批转账,当然实际当中你也可以设置成多种组合,那么常见的组合是这种3+2组合,有三个相关的私钥至少需要两个以上来进行一个签名,由于需要通过多方的地址确认,这就需要这些多方同时合作,这种参与方可以是人,机构或者说程序脚本,这是数字签名。
另外一类是数字证书,我不知道大家注意到没有,我们在数字签名的过程中间要用用户的公钥来解密它用私钥加密的密文,那么怎么确保一个公钥确实是原始公钥呢,这就需要用到数字证书机制,也就是说数字证书是用来证明某个公钥是谁的,这是因为对于数字前面应用来讲的话,很重要的一点就是公钥的分发,一旦公钥被人替换,则整个安全体系将被破坏掉,那么数字证书顾名思义,就像我们日常生活里面见到的证书一样,证明信息的准确性和合法性,它是由证书的认证机构比如CA来签发。
后面我们会讲到在整个密码体制中,CA是非常重要的一个环节,那么我们说了数字证书是经过授权中心也就是包含了公开密码拥有者信息以及公开密钥的文件,那么具体来讲,数字证书内容可能包括版本序列号,签名算法类型,签发者的信息,公开密钥,以及CA的数字签名,以及其他信息等等。
其中最重要的两类信息是这个签发的公开的密钥,还有CA的数字签名两个信息,因此只要通过这个证书就能够证明某一个公钥是合法的,为什么呢?因为它带有一个CA的数字签名,相当于这个CA为这个密钥来背书,当然大家也会问我怎么能证明CA的签名就是合法或者不合法呢,其实这里面CA数字签名合法不合法也是通过证书来证明的,也有一个证书来证明CA是合法的,这个主要是在一些主流的操作系统或者浏览器里面,它会提前预制一些CA的证书,相当于是承认这些证书是合法的,然后所有基于它们认证的签名自然认为是合法的,这样子就确保通过中心签名的这些证书都是合法的。
五、PKI体系
公钥密码体系,所谓PKI指的是公钥基础设施,PKI体系不是代表某一种合法技术而是综合多种密码学手段,来实现安全可靠传递消息身份确认的框架和规范,也就是说如何登记审核,签发销毁证书的一系列组建和规范,一般情况下包含如下几个组建,一个是CA,负责证书的颁发和作废,同时接收这个登记机构RA的请求,那么RA的话是对用户身份进行验证,校验数据的合法性,负责登记,审核过了以后就发给CA。第三个组建是证书数据库,主要是存放证书,一般采用LDAP目录服务,标准格式采用X.500系列。
那么这三个组建里面,CA是最核心的组建,主要完成对公钥的管理,那么用户基于PKI体系,申请一个证书的时候,一般有两种方式,一般可以由CA来生成证书和私钥,当然也可以由用户生成公钥和私钥,然后由CA来进行公钥和私钥进行签发,相当于日常生活里面的公证机构一样,它来进行一个背书,这是PKI体系。
六、Merkle树
Merkle树又叫哈希树,它是一种二叉树,看的出来,它是一个根节点,一组中间节点和一组叶节点组成,那么最下面的叶节点包含存储数据,中间节点是由两个子节点内容的哈希值来组成的,那么根节点也是由两个子节点内容的哈希值来组成的,那么进一步Merkle树可以推广到多叉树的一个情形,从这个Merkle树的构成中间我们就可以发现很重要的一个特点,底层数据任何的变动,比如这个叶子节点或者中间这个节点只要有任何的变动都会向上传递给副节点,一直传递到根节点,那么这样子一个特点,我们用这样一个特点可以进行很多应用。
比如说第一类应用就是快速比较大量数据:当两个Merkle树树根相同时,则意味着所代表的的数据必然相同。只要它的根是相同的,那么它下面的由它构成的数据必然是相同的。
第二个应用就是快速定位这个修改:比如上面这个例子里面,如果某一个叶子节点比如L1中数据被修改了,肯定会影响到副节点,副节点的副节点,一直到根节点,因此沿着这样一条路径可以快速定位到发生改变的某一个叶子节点或者中间节点。
第三类应用就是零知识证明:例如如何证明某个数据,例如L1……L4中包含给定内容L1,很简单,但是不能让这个对方知道具体的内容,很简单,就是构造一个Merkle树,公布这些内容,比如副节点,副节点的副节点,直到根节点,那么我们的拥有者就可以很容易检测到L1存在,但不能获取具体的内容,直到它在,但是它是什么东西不知道,这是Merkle树。
最后总结一下这一讲的主要内容,这一讲首先从区块链的定义出发,引出了密码学在区块链技术架构中的一个重要作用,密码学是确保区块链交易信息机密性,完整性,认证性,不可抵赖性的重要手段。那么现代密码学提供了非常多的有效手段,为区块链保驾护航。
这节课我们学习了哈希算法,了解了哈希函数的定义和特点以及在区块链中的应用,我们学习了加解密算法包括对称加密和非对称加密,了解了数字签名和数字证书以及公钥密码体系即PKI体系,最后我们学习了Merkle树的应用,这些密码学技术在后面相关内容的学习中都会有涉及到。希望大家课后再自行补充学习。这节课到此结束,谢谢大家。
想要学习更多区块链知识,请扫码加入: