比特币硬骨头:非对称加密技术

96
寂寞火山
2017.10.19 17:50* 字数 3767

前面写了一篇《深度剖析比特币共识机制和拜占庭将军问题》,文中多次提到非对称加密技术,由于上篇文章主要讲共识机制,而且非对称加密过于技术,限于篇幅当时没展开。如果说共识机制是比特币最精彩的部分,那么非对称加密算法又可以说是共识机制里最精彩,最难啃的硬骨头,所以我觉得还是有必要专门开一篇详细研究下,大家不要看到技术两个字就怕,我有信心可以让不懂技术的人也能看懂。

加密其实是一个刚需,越重要、越隐私的内容,越需要加密,比如战争中的情报,商业机密,犯罪证据,以及与钱相关的各种信息等等。然而悲剧的是,重要的东西,常常跟普通老百姓没啥关系。所以在历史的长河中,加密技术一直都是一个神秘的存在,只有国家和一些强大的组织玩得风生水起,我们P民也只能听一些传说,或者在电视剧里看到。

要讲非对称加密,我们首先得说一下对称加密,早期的加密一般都是对称的,最简单的莫过于弄一个密码对照本,我们在电视剧里也应该看到过,战争年代发电报,这些报文肯定是加密的,收到之后,谍报员需要拿着一个小本本进行对照翻译。

为了便于理解,我们进一步简化问题模型,假如两个机构A和B互相需要传输纯数字,咱们别管这些数字是干啥的,这只是一个模型。如果AB都不想让别人知道传输的真实数字,他们可以简单定一个规则,“所有的数字传输之前都加1”,这时如要传输的数字是 8878,实际传输的数字则是 9989,那么对于接收到数字的一方,只需要对每一个数字减1即可得到真实的数字。

所有的对称加密算法都有一个共性,就是解密是加密的逆向过程,这个逆向过程是根据之前就订立好的规则来的,这个规则可以是一句话,也可以是一个复杂庞大的密码本。

对称加密是不是很容易理解?然而容易理解常常意味着容易被破解,对称加密有个严重的问题,所有的发送方和接收方都用同一套规则,只要有一个点被攻破,所有其它信息发送方和接收方都不能再使用这套加密方法,然后整个情报系统需要立刻终止信息发送,同时立刻启用新的加密规则,还要第一时间把新规则同步给所有的情报机构。这时候要命的问题又来了,同步过程如何保密呢?在没有互联网的年代,需要人跟人长距离接头来完成同步,这个过程中,如果接头人叛变了,或者中间被人截获了,那岂不是彻底悲剧了?而且对于一个简单的,不变的,有规律的对照规则,只要收集到足够的信息,一个一个猜,也早晚能猜出来。

为了进一步提升安全性和灵活性,我们能不能发明一套不对称的加密算法,就是不可逆,或者说加密过程和解密过程不一样的算法呢?虽然很困难,但是经过历代数学家的努力,最终还是实现了。

为了便于理解,我们先来看一个简化的数学小魔术,文科生不要跳过去,我保证只要会加减乘除就能看懂:我可以让你随便想一个三位数,然后你把这个数乘以91,你只需要告诉我结果的最后三位数,我就能猜出你想的是什么数字,是不是很神奇?

有点懵?那让我们来举个例子:比如你想的数字是123,然后123*91=11 193,你把这个193告诉我,我就能猜到你想的是123,为什么呢?背后其实是一个纯数学规律:

首先,91*11 = 1001。

然后,任何一个三位数乘以1001,末尾三位是不会变的,比如:123*1001 = 123123。

基于以上两点数学特性,你想了一个数字123,我让你先乘以91,结果为11193,然后你告诉我后三位193即可,我再乘以11,也就是:193*11 = 2 123,相当于咱们两个合力乘了1001(123*91*11 = 123*1001),最后三位不变,还是123,也就是你心中所想,但并没有直接告诉我的数字。

这里有一个难以理解的点,就是你只告诉我11193的最后三位193,我拿193乘以11,但193并不代表你的完整数字啊,所以并不是你的完整数字乘以1001,那么后三位不变的规则怎么还适用?如果问出这个问题,说明还没真正理解上面两条数学特性,因为是任意数字乘以1001,末尾三位都不变,并不需要知道你乘以91之后的完整数字,只需知道最后三位即可。

或者这么说,当你给我一个193的数字时,其实我知道你的数字肯定是XY193,虽然我并不知道XY的具体数字是多少,但是没关系,我拿XY193*11,你会看到,不管XY为几,其实都不会影响结果的后三位:

56193*11 = 618123,最后三位还是123.

47193*11 = 519123,最后三位还是123.

88193*11 = 970123,最后三位还是123.

因为,不管XY为几,你想的原始数字123,乘以91之后,得到XY123,我再拿XY123乘以11,就等于你的原始数字乘以1001,还记的刚才两条数学特性的第二条么?任何三位数乘以1001,末尾三位是不变的!这正是这个数学“小魔术”背后的奥秘。

能理解这个小魔术了么?但是我为什么要费这么大劲讲这个小魔术呢?是时候祭出本文的主角了:非对称加密算法!

让我们把刚才的数学小魔术中的数字抽象一下,假设,我想的数字123是要加密的内容,91是接收情报方的公钥(所有我方情报机构都知道),11则是接收情报方的私钥(只有他自己知道),当我要发送绝密数字情报的时候,我用123*91,得到11193,然后我把这个信息的前两位11直接去掉,导致加密混淆后的信息不完整,并把残缺的加密信息193发给目标情报机构,目标情报机构获取193后,用只有他们自己知道的私钥11去乘以193,得到2123,然后取后三位123,就是我真正要发给他的完整信息了。

怎么样,这样描述一下是不是觉得很神奇?

1,整个加解密过程,分为了三个部分:私钥、公钥和公开的算法(任意数字乘以1001,末尾三位都不变)

2,公钥和私钥还不一样,公钥告诉所有友军,私钥只有自己知道,不用像密码本还要传来传去,路上有被人截取的风险。

3,加密和解密的过程不可逆,加密是乘以91,解密是乘以11,而且传输内容是残缺的,给人肉找规律制造了麻烦。

4,就算公钥被破解了,没关系,立刻再换一个配对的公钥和私钥即可,加密算法根本不用变。

而这一整套思路,就是非对成加密的核心逻辑,相比算法可逆、所有人公用一套密码本的对称加密,是不是更加安全和灵活了?

以上是我能想到的最简化模型了,理解起来似乎并不复杂,而且通过公钥91,递归暴力破解找到配对的11,也不是不可能。但现实中,绝对不会只是乘以1001这么简单,类似的数学特性可以一直放大,比如任何数字乘以400 000 001,末八位都不变,然后我们可以把 400 000 001 拆分为 19801*20201,然后还可以再大,更大,一直大下去,于是大出了一个著名的非对成加密算法:RSA。

如今RSA算法已经成为一个在互联网非常流行的加密算法,但在真实历史中,直到1976年之前,人类还在使用密码本那种对称加密技术,1976年Whitfield Diffie 与 Marty Hellman终于提出了非对称加密概念,一年后,罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起在非对称加密理论的基础上,发明了RSA加密算法,人类的加密算法历史掀开了新的篇章!

RSA利用的就是类似我前面举例的数学小魔术的原理,这个小魔术,其实还利用了一个数学原理,叫做大数因式分解,我们上学的时候其实都学过相关概念,就是给你一个数字,让拆分成两个数字相乘。已知两个超级大的数字,求他们的乘积很容易;已知乘积和其中一个超级大的数字,求另外一个超级大的数字也容易,但是如果仅仅知道乘积,让你找出是哪两个数字相乘,不好意思,除了递归暴力破解,没有其它办法。

也许会有人说,现在芯片多强啊,我们国家还有银河呢,暴力破解就暴力破解,谁怕谁!这是无知者无畏,一个RSA200,2007年,用当时的顶尖计算机,还用了18个月才破解。然后我要是定期1个月更换一次配对的公钥和私钥,你怎么破?更何况现在还是 RSA256,位数更多了。

RSA之后,科学家们又发明了一种叫做椭圆形曲线算法(ECC),也是一种非对称算法,在比特币中占有重要地位,是比特币钱包安全密码学的基石,也是比特币被称为密码学货币的重要原因。

ECC相对与RSA几乎完胜,但是本篇主要目的是为了让大家理解非对称加密的逻辑,不是要把每一种加密算法都讲一遍,这里只把ECC的优势罗列下:

1,安全性更高,160位的ECC能与1024位的RSA比肩。

2,计算量小,处理速度比RSA快得多,计算量就是耗电量啊,请别说比特币不在乎耗电了好么?

3,存储空间占用小。

4,宽带要求低。

ECC的这些特点使它逐渐取代了RSA,成为主流的非对称加密算法。至于ECC具体原理是怎么样的,要讲的话,又要开一篇新的文章了,而且ECC要比RSA难理解的多,不搞算法研究的同学,还是没必要看了。通过本篇,大家只要能够理解非对称加密的逻辑和牛逼之处就好了。

最后,让我们回到比特币,看一下非对称加密技术在比特币中到底是怎么运作的。我们都知道比特币两个账户之间转账的时候,首先你有一个唯一地址A(一串很长的数字和字母混合),然后对方也有一个地址B,其实你的地址A就是你的公钥,而对方的地址B则是对方的公钥,那么私钥跑哪里去了?其实私钥藏在你的钱包里!当你发送一条“A转账100个比特币给B”这样的信息出来时,首先,这条信息会用B公开的公钥加密,然后再用你藏在个人钱包里的私钥加密,再然后会把双层加密信息同步到整个比特币网络节点,当然也包括B。所有的节点收到这条信息之后,它们会用A,也就是你公开的公钥进行校验,因为你的公钥跟你的私钥是唯一配对的,所以能够代表你的身份,所有的节点确认后会进行记录。但是因为你做了两层加密,第二层加密用的是B的公钥,而只有B有自己的私钥,所以具体的数据只有B能拿到。B跟所有其它节点一样,先用A的公钥验证来源,并且做第一层解密,然后再用自己的私钥做第二层解密,就可以拿到真实的数据,B确认收到钱之后,B会用类似A发数据的方式进行全节点广播。至此,一个点对点的,去中心化的,基于非对称加密的交易大功告成!


我的比特币科普系列文章:
比特币的基因
指责比特币挖矿耗电是无理取闹
深度剖析共识机制和拜占庭将军问题

区块链
Web note ad 1