Jinghui Liao

A computer security PhD student who prefers blockchain and 6am sunlight and misses his family.

透视区块链里的密码学

June 21, 2020

前言

大多数人对区块链的理解还只是一个大概的印象,虽然很多人都在说区块链是去中心化的可信基础,但是却并不是很能理解具体的原因。这其实很正常,我们现在通常谈到的区块链其实是基于一系列的密码学算法构建而成,这对于非密码学专业的人来说,理解起来是很艰涩的。这里,我们对整个区块链的结构从密码学的角度来进行一个整理讲解。针对具体的密码学技术,尽量使用通俗的例子,希望能帮助大家增加对区块链的理解。

账户

我在深入学习区块链之前最好奇的就是在一个分布式的系统中每个人的账户都是如何生成的,毕竟账户这个东西,我们在有中心化系统中是由服务方进行生成和验证的,比如我们申请微信号,这个微信号是腾讯在他们自己的服务器里帮我们创建并管理的。但是在区块链系统中没有这么个企业帮我们创建账户,那我们在区块链里是如何生成账户的呢?这里我们就引入密码学里的第一个概念,【(安全)随机数】,什么意思呢,就是我们自己在自己本地随机的生成一个字符串,这个字符串就是我们的私钥了,是不是感觉太随便了,没有什么安全性,但事实上我们现在使用的系统本身都是支持生成安全随机数的,在生成随机数的时候或者基于你鼠标在显示器上划过的轨迹,或者基于系统内部的一些具有足够不可预测性的数据作为种子来生成。由安全随机数算法生成的随机数,我们可以无限假设是安全的,为什么呢?举个例子,现在允许你随机在全宇宙中选择一个原子,不做标记,然后让你的朋友在不知情的情况下找出这个原子,你可以想象一下这个难度,而基于不同的足够安全的随机数种子生成相同的随机字符串的概率比找到那个【原子】还低的多得多。因此虽然我们都是在自己本地生成的区块链私钥,但是完全可以认为是安全的。

现在我们通过安全随机数算法生成了私钥,那么我们又是如何通过私钥生成公钥以至地址呢?这时候我们就需要引入第二个密码学概念【公钥算法】,【公钥算法】通俗来讲就是公钥加密,私钥解密,任何拥有你公钥的人都可以用你的公钥来对数据进行加密,但是只有对应的私钥才能对这个数据进行解密,就好比是你造了保险箱,任何人都可以把他的东西放在保险箱里,然后锁上箱子,一旦锁上只有你才能打开。这个公钥算法在区块链里用的是椭圆曲线,原理则是数学上对大数进行因数分解的困难。抛开复杂的证明,我们举个例子,大家都知道6 可以由 2 乘上3 得到,这个很简单,但是如果给你超级大的数呢?比如一千位?两千位?你可能会想着用自己的电脑来计算,毕竟数学已经发展这么多年计算机算力也几何式增长,肯定算得出,但是很遗憾的告诉你这个时间是成千上万年,足够我们每个人回归地球母亲了。给一个足够长的私钥,我们可以得到一个公钥,基于大数因数分解的困难性,没有人可以通过这个公钥计算出私钥,这样我们就得到了一个区块链账户。这个账户仅仅包含私钥和公钥,那么我们通常使用的地址又是怎么来的呢?简单来说我们通常使用的地址就是公钥的小名,比如迪丽热巴·迪力木拉提是迪丽热巴的全名,但是这个名字太长了,所以我们通常叫她热巴,公钥这里也是,公钥太长了,虽然安全了,但是在使用的时候没这个必要,毕竟数据是要存储起来的,没必要的数据也就没必要存在,因此我们对区块链账户的公钥进行了一系列的【哈希】操作然后又添加了一些版本信息以及校验信息等等生成我们最终的区块链地址。这里提到的【哈希/摘要】也是一个重要的密码学概念 后文会提到。

以上介绍了区块链里的账户,基本逻辑就是 随机数→私钥→公钥→地址。 随机数是不可重复的,公钥和地址是可以计算的,因此你一定要保护好自己的私钥,有私钥,有一切,没私钥,那你可能也要像英国小哥一样天天在垃圾站扒拉自己的硬盘了。

交易

交易对于大对数用户来说就算是了解区块链最多的地方了,毕竟大家用区块链主要还是为了【交易】,假如最开始中本聪提出的比特币没有币这种激励概念,那恐怕无论区块链还是比特币现在都早就被遗忘了。我们中国人现在习惯使用支付宝和微信来进行转账发红包了,这个过程是由支付宝和腾讯这种中心化的机构来帮助我们处理的,比如我给你转5毛,你给我转500,这个过程其实都只是数据的流动,支付宝会真的把五毛钱挪来挪去么?不会,都只是数据库里的数字变化而已,但是因为支付宝和腾讯是大企业,我们在使用的时候压根不担心他们会搞事情,我们相信他们不会擅自动我们账户里的钱,无论你查看多少次,五毛也不会突然变五个亿。但是区块链的交易这里就有了问题,我们没有一个中心化的企业帮我们管理这几个亿。我说给你转1个亿,但是我账户里只有五毛,怎么办?我说给你转五毛,但是区块链从我的账户里给你转了一个亿我怎么办?烦恼,有钱人的生活,就是这么朴实无华,且枯燥。

解决这样的困扰的是叫【数字签名】的密码学算法。【数字签名】顾名思义就是数字化的签名。我们在日常生活中经常需要用到签名,无论自己字写的多丑,都要练好签名,因为签名在很多场合都代表着自己的授权,是有法律效力的,你不要小看了这个签名,古代就算是冤案,那也要把你打个半死让你签字画押,而不是直接伪造。在数字时代,取代签字画押的就是【数字签名】了,毕竟你不能对着电脑屏幕按指纹,没人会理你的。数字签名也是基于我们提到的【公钥算法】,但是反着来,前面提到公钥加密私钥解密,这里我们用私钥对输入数据生成一段可验证的字符串称为签名,这个签名可以用公钥来进行验证。数字签名可以保证原数据的完整性和真实性。比如你给你女朋友发个 I love U, 然后附带个签名过去,你女朋友验证了签名知道确实是你发的,又知道数据没有被改过,这就是个浪漫的爱情故事。但是如果没有签名,中间被情敌改成了 I hate U,你女朋友又没法验证,那你的下一个520可能就要自己过了。

同理,【数字签名】在我们在区块链的交易过程中也是扮演者同样的角色,保证交易的完整性和真实性,记住两个关键字就好了,完整性和真实性,完整性的意思是我想给你转五毛就是五毛,你不能多拿,真实性就是我没给你就是没给你,你不能假传圣旨。具体来说就是,我生成一笔交易写上给你转五毛,然后用我的私钥来对数据进行签名来说明这个交易确实是我授权的,然后把这个交易广播出去,然后别的节点就会验证这个交易,一看签名发现数据是对的也是真的,那剩下的事情就交给共识了。但是如果发现数据和签名对不上,那不好意思,你的五毛没有了,一毛都不给了。

区块

我们在查区块链图片的时候基本通篇都是数字化铁链的图片,虽然看上去很酷炫,也和【链】这个词很契合,但是这个区块就很委屈了,毕竟铁链子的结构里完全看不到区块原本的样子,我们这里给区块正名,我区块,今天从这里跳下去,哪怕打包到分叉上,也不当一个铁环。

从数据结构上来说哦,一个合格的区块应该长的像一颗二叉树,或者你学生物肯定看过谱系图,就类似那玩意,从爷爷辈到父辈到自己这辈整体看下来是个分叉的树,不过区块是个二叉的。这样的结构是因为区块本身是基于Merkel Tree这种数据结构来进行组织的,最下层是交易的【哈希】,往上是两个交易哈希的哈希,再往上是两个两个交易哈希的哈希的哈希,嗯,很烦躁,有点绕,但是你可以通俗理解为你的公司,最下面是你,干活的;上面是主管,看你干活的;再上面是主管的主管,看下级主管看你干活的,以此类推直到CEO。

这里着重提一下【哈希/摘要】,前文也已经很多次提到了,这里专门说一下,哈希算法是一种基于哈希函数/散列函数的单项算法,具有定长性和不可逆性,定长是指无论你输入多长的数据,输出都是固定长度的字符串;不可逆性是指你无法通过输出的数据逆推出原本的输入。举例子的话就是【码】这种东西,在加码的过程中,无论原本的数据多么内涵,输出出来的都是固定大小的色块,原本的数据信息其实是大量混淆并且丢失了的,你无法根据码后的数据恢复出码前的数据,所以,放弃吧。

区块链

虽然大家最常听到的是区块链,但其实区块链本身却是最容易理解的,网上的图片其实也足够清晰明了,就是一串大链子,由一个个区块串联而成,而且其实在每一个区块生成的同时,它就已经被固定在了区块链上,而不需要额外的生成一条链的过程。我们在讲区块的时候忽略掉了一部分数据,就是关于当前区块在区块链上的高度,以及前区块的哈希值。有了这两个数据,每一个区块在所有的区块构成的链式结构里都具有了位置的唯一性和数据的不可篡改性。举例子的话就是我们小时候小学组织出游,老师为了避免学生走丢,都让每个学生顺序的记住另一个学生,这样如果老师想查人,只要让每个学生看看自己下一个学生是不是还在就好了,这样如果你中间想自己跑着玩,你上一个学生立即就知道你没了。你可能会问,那如果你偷偷把朋友也叫过来一起玩夹在你之后呢,但是每个学生也有自己的编号,如果你偷偷夹了朋友,那你朋友的编号必然要么跟你或者跟你的后一个人是重复的,这样也很容易发现。基于这样的组织形式,我们就从交易打包成区块,又从区块链接成了完整的区块链。

Share This Post