比特币科普2:非对称加密技术(不懂技术也能看懂)

35次阅读
没有评论

共计 4103 个字符,预计需要花费 11 分钟才能阅读完成。

比特币科普 1:共识机制和拜占庭将军问题 》这篇科普文中多次提到“非对称加密技术”,

由于上篇文章主要讲共识机制,而且“非对称加密”过于技术,限于篇幅当时没展开。

 

如果说共识机制是比特币最精彩的部分,那么非对称加密算法又可以说是共识机制里最精彩,最难啃的硬骨头。

所以我觉得还是有必要专门开一篇详细研究下,大家不要看到技术两个字就怕,我有信心可以让不懂技术的人也能看懂。

 

加密其实是一个刚需,越重要、越隐私的内容,越需要加密,比如战争中的情报,商业机密,犯罪证据,以及与钱相关的各种信息等等。然而悲剧的是,重要的东西,常常跟普通老百姓没啥关系。所以在历史的长河中,加密技术一直都是一个神秘的存在,只有国家和一些强大的组织玩得风生水起,我们 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 之后,得到 XY193,我再拿 XY193 乘以 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 发数据的方式进行全节点广播。

至此,一个点对点的,去中心化的,基于非对称加密的交易大功告成!

→2017.9.29 于 上海

正文完
 0
评论(没有评论)

寂寞火山个人博客

文章搜索