上一篇文章介绍了在比特币中随处可见的哈希函数,这篇文章就来讲讲区块链的另一个基石技术:非对称加密。
1.
先说说加密(英文为encryption)是什么。
在百度百科中,对加密的解释是“加密,是以某种特殊的算法改变原有的信息数据,使得未授权的用户即使获得了已加密的信息,但因不知解密的方法,仍然无法了解信息的内容。 ”
通俗来说,你可以把加密理解为以下这个例子。
你和一个朋友,住的远,没法面对面说话。但是又想要交流点悄悄话,所以只能通过写信的方式(无线电等现代通讯技术也一样,这里用写信举例,便于理解)。既然是悄悄话,就是不希望被第三个人看到的。但是书信从一个地方邮寄到另一个地方,要经过很多人的手。为了防止别人偷看,除了把书信封好(盖上火漆等方法)之外,最好的办法就是把信写的别人看不懂,只有你们俩能看懂。
比如你们可以提前约定好一套加密方法,后来的通信全部用约定好的加密方法进行加密。这样即使别人截获了你们的书信,也因为看不懂其中的信息,而不会对你们造成更大的损失。
当然,近代的无线电通讯技术乃至后来的宽带、互联网通信让我们早已可以不使用书信进行通信了。但技术更先进了,通讯更便捷了,并没有改变信息流通过程中依然存在被监听的可能性。而悄悄话的需求总是存在的,所以加密的需求也总是存在的。对加密算法,或者说加密方法的研究也就一直进行了下来。
在很多谍战片里(《潜伏》、《风声》等)经常出现的一种加密方法是通过一些公开发行的报纸和书籍作为密码本。举个例子,比如使用《三国演义》当密码本,当你写信要使用“我”这个字时,不直接写“我”,而是在《三国演义》中找到“我”这个字出现的位置,然后把位置信息写在信中。假如“我”这个字出现在《三国演义》的第15页第3行第20个字,那么就可以把“我”写成“015003020”这样的形式。这就是加密(英文为encryption)的过程。而当对方收到书信时,翻阅《三国演义》到对应的位置,就可以明白你的意思了。这是解密(英文为decryption)的过程。
所以可以认为,加密其实就是通过某种加密算法/方法把每个人都能看懂的信息(称为明文),变成只有相关人士能看得懂,别人看不懂的信息(称为密文)的过程。在上边的例子中,明文就是“我”,密文就是“015003020”。
2.
加密算法的两种类型
在现代密码学领域,加密算法可以分为两种,对称加密(symmetrical encryption)和非对称加密(Asymmetric encryption)。
两种类型加密算法显著的区别在于密钥有几个。对称加密只有一个密钥,而非对称加密有一对,即两个密钥。
先说说密钥是什么。密钥就是加密(把明文变成密文)和解密(把密文变成明文)的关键,即钥匙。上文举例中提到的《三国演义》,就是一个密钥。有了密钥《三国演义》,你就可以把明文“我”变成密文“015003020”,再把密文“015003020”变回明文“我”。
对称加密的密钥只有一个,加密和解密过程都靠这一个密钥。所以举例中用《三国演义》当密码本的那种加密方式就是对称加密。
对称加密用起来很方便,加密和解密的过程都很简便和快速(哪里买不到《三国演义》?)。但对称加密有一个非常大的局限性,就在于密钥的传递问题。即通信双方在进行加密通信之前怎么约定好要用《三国演义》,而不是《西游记》的问题。
如果两个人刚开始在同一个地方,然后说好分别后,写信用《三国演义》加密,那问题就好办了。但是,如果两个人一开始就不在同一个地方呢?写信告知用《三国演义》?那肯定不行,既然要加密,就是假定了书信不安全。那么派中间人传达?肯定也不安全,中间人叛变了怎么办。看起来只能劳烦两个人亲自跑一趟,接下头了。但这样做虽然最安全,但是要付出的成本可想而知的高。
于是为了能安全地传递密钥,就诞生了非对称加密技术。
3.
非对称加密技术
非对称加密的密钥有一对,即两个密钥,私钥和公钥。一个不公开,只有自己知道,所以叫私钥。另一个会公开,大家都能知道,所以叫公钥。公钥用来加密,私钥用来解密。而且公钥加密出来的密文,只有对应的私钥可以解密。
举个不太恰当但是更易于理解的例子。
你是卖面包的面包师,而你想跟另一个城市卖面粉的商人建立交易关系。你们都很忙,没时间特意跑一趟,聚一起约定密钥,但是又觉得其他传递密钥的方式不安全,于是决定使用非对称加密技术来通讯。
你的公钥和私钥分别是《红楼梦》和《唐诗三百首》(假设这两本书是可以作为一对公钥和私钥使用的)。然后,你会告诉面粉商人,你的公钥是《红楼梦》。因为公钥只能用来加密,解密的话,只能用私钥。所以公钥其实可以告诉所有人,你采取任何方式告诉他都可以,甚至是登在当地的报纸上广而告之。
面粉商人从信件或者报纸上得知你的公钥是《红楼梦》后,就可以给你发加密信息了。通过《红楼梦》,面粉商人的信息被加密成密文发送给你。收到后,你再用《唐诗三百首》来解密。而别人不知道你的密钥是《唐诗三百首》,所以即使面粉商人送来的密文被登在当地的报纸上,别人也不知道是什么意思。
同样的,如果你想要给面粉商人回加密信息,就也得知道面粉商人的公钥是什么。至于他的私钥,你并不需要知道。当然,人家也不会告诉你。
4.
公钥和私钥
前文举例说明了公钥和私钥的用法,接下来,我们就看看公钥和私钥长什么样子。
我随便用RSA算法(众多非对称加密算法中的一种)生成了一对公钥和私钥,如下:
公钥:
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxUa+RZEHig7fW7x7/cH+ 3zgkFCCEb3OD7E2JJzsgSOwoAuRM71SE6ouhX3jf7RyXNBIyY0omeSJJUoaWoRum 8KRwkTDv4BUNWFRhNG5AhnaOxP3dwXOsfVyM7aSXIzj1Tn7kzJTXeKExzKAkiLP1 EufLDt6LJF9EZwBFpkWi2nOAEZELVIhdUpEpSaBIhsokl30PK+V/gAgGvZaC5oaa pLJ7wUFtnMh74NdCJxTIYCgJ4C8ggdmpylG1ujSDiJk58u43KtYBYb0JfPKox5Cb 7Fe6LkWX2Dd+50FU0n0qd2R8QyRB20+G907wgBxNzQktvoWHKZHyq1+kpZxmm/of yQIDAQAB
私钥: MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDFRr5FkQeKDt9b vHv9wf7fOCQUIIRvc4PsTYknOyBI7CgC5EzvVITqi6FfeN/tHJc0EjJjSiZ5IklS hpahG6bwpHCRMO/gFQ1YVGE0bkCGdo7E/d3Bc6x9XIztpJcjOPVOfuTMlNd4oTHM oCSIs/US58sO3oskX0RnAEWmRaLac4ARkQtUiF1SkSlJoEiGyiSXfQ8r5X+ACAa9 loLmhpqksnvBQW2cyHvg10InFMhgKAngLyCB2anKUbW6NIOImTny7jcq1gFhvQl8 8qjHkJvsV7ouRZfYN37nQVTSfSp3ZHxDJEHbT4b3TvCAHE3NCS2+hYcpkfKrX6Sl nGab+h/JAgMBAAECggEAevAIGQA1S5LTHK8MMeoYM/Efgq90+KNrHfJ/u0P8bZVF pe+yBh+MqUGUshN4sKH1lEyWvAt0iF6WhOg8rG+4DBTd1Y1Cn0lfRKFo5iyi52iw thBihnDYmFL5vAqq6RdQv7cSTG+hC5qglx1hRxOmcT6j60NCQMthrDKeNO0GfM0O q8mIbFId1xQwX9nhdGUUi7RMGtFNlLufkzmsYFQytE8kfrjr9mhaITg2l/7XmnhR vlLuA/soQiT4fvr1rF9evq6TTQfmKRLI01CYNmogiprd5pV2ICTE84yEOXZVR6lr twUDiR4y6U53+A0XsHDsjq/Hl/5New5YZJPUN+qggQKBgQDyOFN4zYdATpbJR8FX zOA45Ha3oplmB+H6B/4e1DtkPl9Ph55bQa0d/lWAO9CgTPOsjbh8zCPxJcEfMcsO bDVZO6MUrZkFt2aJ8pkgOdQAgFN+Pt1ZX0x7FwfUcpLEf15BcsB3LT6rg//+xUrp 4WW95/6kW7xOOuLA1XPI9xIyGQKBgQDQf9xeskoK/92riGD48snD4PPzw7VKRGJs Ub9U3vwh7kokOLNO76LuptzZKp9hXVBoPMCdYr++HPNbxMjUmUcX63fTwbX9W6QO L3ut5+cf6i/R8XRjKz42VuTp0y2h/KvDulCbhft4S/REP1veh5M7ygnbxCnQrzig UuMXD53xMQKBgQCxtDNBMIBm5IFpoFQvpyZldu/GH+us2GGov05nrcr4622fel7q ko+ArsRptPiFco9fbAYKwPYpiEpcKXrQ1QB6u+8UT5wxfnEjCbHf2602xO78cwCP /gOtVqMu8PPOZ6duGtMrXC1bRhd9AZ/JYMz0+4xtZsQLHNaZJMCyktltmQKBgQCb dlr4ePPgk7vTRNMZjN6IoVkE725ju+2vWpzRSZqyKh06ONTqDKBuVhjiDHfef1eP AY2VTKYvuSJz0Jz2eHucCETGre9mxEflE96iYwHguBuD7QedUgcHOW9iMcYavG3O eUPVUueYYPn3UU7M9EYCFLmZFgEfyybr1CHjdg+MYQKBgDKcCOdrCokFbkNf0wT5 6NIEFS/vv6vjuy3LQflhwCy6R1+JMBjNpUhC6nTzfNhJVk0uCH4vjI6EUYaanOte LfZ0dHNs7Ubusb/naEHd0X98ZKrzqxJ/nvyMSIGWxLZ4TSR1i57lvt4lS/ajjdeS 17rlmJzpdmkc+9XRQm0A62Wv
其实就是看起来毫无规律的随机字符串对吧。但就是这两串非常短的字符串(跟把整本书当作密码本比起来很短了)就可以起到目前为止无法破解的加密作用。
我用这个公钥对本公众号名称“流向未知”这四个字进行了加密处理,得到的密文如下:
mNsAxdjqZHdnNu0fm7RWis0aJTBiTwq4HA7mm0hnMb4vsMqW4HkxXU0FiwSLe9qpqKYN92CKMbaaxrD05JaGoc8cmTDTjOlAvTOu7y9YgjbcM7+z2mTeUPgRN34lKLRIxNtUz1OWHmawy705OJIIZ2RBwE0kvOC1cjObY/RAkZkKKFPUQpWb58xEAvw039TAUdcqj6LgXEUkzqT+8ATiFCvxbx2rQi7vkDs+n/+N/r0hwBSC5bc0jqZDxHzZ8vKdAEO1ic6FE4zwoogxKmr4FErj0PrNdkMgxVNKcXDQCmGt4vvoNmP97IiRys6j9n/lCxee1QPvewzD9tgLOTHawQ==
你可能会说怎么“流向未知”四个字加密得到的密文会这么长?
是的,即使你加密一个数字“1”,得到的密文也是很长的。“1”用上述的公钥进行加密,得到的密文是:
XkQstkWjVhek1IXzock+7ozEn9TTgs/t17LgfY2530YieS06NbkDcTUZJDEXV5RcNLJDWRayqg+nFediO7Neamr+LsdazepTuRiQRPecEYKK0MRxefaifPo8I16XPhF/orf/l8CGug46SNVJr8vnDC045Q8DPni/jq8OueCf6amVHzGZN77BM6f51FGQvPvxR2TuZuB7FxN+mXexniGLAga+G1IVOgtqOJyU3ztpzNiqQb5G4wz7PBtWVPQN48Hw4JCH0SW7fJv61igjVC6jIZkYx1ALg3NiIO/i1e5kVrmTwtX+VmlArHHdnVwGe7N1AwuviGfcKZUG/5XcEJyu2w==
如果只给你上述的密文,你肯定不知道什么意思。但如果你有上述的私钥,就可以把密文翻译成明文。
5.
非对称加密算法
非对称加密技术中的公钥、私钥以及加密和解密都是基于非对称加密算法的。非对称加密算法有很多种,每种算法的原理不同,所以安全性、性能、效率等方面也会存在差异。
前文提到的RSA算法是目前应用最广泛的非对称加密算法之一。它在1977年由麻省理工学院的三位科学家提出,他们分别是罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)。RSA即是他们姓式首字母拼成的。
其他应用很广泛的加密算法还有DSA(Digital Signature Algorithm,数字签名算法)和ECDSA(Elliptic Curve Digital Signature Algorithm,椭圆曲线签名算法)等等。
因为篇幅原因,在这里我就不对这些算法的原理进一步展开了(当然主要原因还是我也不懂这些算法,等我有时间进一步学习了再讲)。
6.
非对称加密可以解决对称加密密钥在公开环境中的传输问题。但这并不是说非对称加密就可以取代对称加密了。
因为非对称加密的算法更加复杂,因此效率是比对称加密低的,所以不太适合数据量比较大的情况。在实际应用场景中,我们需要根据具体情况来判断使用对称加密还是非对称加密技术。
在比特币中,公钥代表了一个交易者的地址,或者说是身份。即你的公钥就代表了你,像银行卡号一样。比如你要转1个比特币给面包商人,那么在比特币网络中记录的是你转了1个比特币,收款方是面包商人的公钥。因为只有面包商人拥有该公钥对应的私钥(就像银行卡的密码),所以面包商人是可以证明自己是该公钥的主人的。
公钥和私钥与银行卡号和密码之间的区别主要在于:
银行卡需要你本人去银行办理,与你的真实身份绑定,而公钥则是由你自己可以通过计算机随意生成无数个,且不与你的真实身份绑定,这就有了一定的匿名性质。你的银行卡密码则可以随意更改。
银行卡的密码从数学上来说跟银行卡号没有关系,因此你可以随便更改多次。但是私钥之所以能解密且只能解密对应公钥加密的密文,是因为一对公私钥是存在数学上的关系的,是强绑定的,所以你自己不能修改私钥。这也就意味着如果你的私钥丢了,你就无法证明你的公钥是你的。
结语
本篇文章介绍了非对称加密技术,涉及到公钥、私钥和基于它们的加密、解密过程。
我们再来看一下在之前文章中已经反复出现多次的那张比特币白皮书的截图。
上一篇文章我们已经讲过哈希了。这篇文章我们又讲了公钥和私钥。现在这张图片中就只剩下签名我们没讲了。
其实,数字签名技术也是基于我们今天讲的非对称加密技术。我们下一篇文章就来讲讲这个数字签名技术。
