五、公钥与私钥
在老张写给老王的交易文件里出现了一个新名词:公钥。
什么是公钥?既然有公钥,那么有没有私钥呢?
有的。公钥(public key)和私钥(private key),正是我们即将介绍的另一组新概念。
俗话说,一把钥匙开一把锁。然而,在公钥和私钥系统中,
我们却非得给一把锁配两把钥匙:被钥匙A锁上的锁只能用与之对应
的钥匙B才能打开;反之亦然,被钥匙B锁上的锁也只能用钥匙A来
开锁。
我可以选择这两把钥匙中的一把作为私钥,
藏在一个非常安全的地方。除了自己,任何其他人都休想得到它。
剩下那把钥匙则可以作为公钥,配上一千多把,满大街乱扔,
谁想用谁用。
自家的钥匙满大街乱扔?万一被不怀好意的人拿了去会不会出岔子?
其实不必担心,我们说过,公钥和私钥是一对钥匙,
二者必须配合起来才能起到应有的效果。
让我们先举一例来说明它们的用途。
话说大唐天子唐明皇很宠爱一位名叫杨玉环的贵妃。
这杨玉环生的天仙一般,不但人聪明,还懂音律,擅歌舞,
甚得天子欢心。
杨贵妃平生有两大爱好,一是泡温泉,一是吃遍天下的水果。
泡温泉很容易,因为他们在骊山脚下就有一处豪华行宫,
闲来无事去那里住住非常方便。而吃水果就有点难了,
因为好的水果大多生长在南方,从遥远的南方把水果送到长安,
路上要很多人经手。这些人虽然口口声声死心塌地地效忠大唐天子,
然而依然难保他们会在途中产生二心,给那鲜美的水果玩些掉包、
卡油、或以次充好、以小充大的勾当。
为了让最疼爱的妃子吃到可口的原装水果,
唐明皇想出了一个绝妙的计策:让工匠制作了数千个水果专用匣,
每个匣上配有皇家御用锁。所有匣子上的锁都使用两把钥匙,
一把公钥,一把私钥。私钥只有一把,由唐明皇亲自保管。
公钥随锁附在匣子上,一起被分发给全国各地的大小官员。
唐明皇传出圣喻:今后各地官员凡欲向朕进贡水果者,
必先以此御匣小心盛之,再以所附公钥封之,不得有误—―钦此。
从此之后,唐明皇每天都会收到很多从全国各地送来的水果匣。
每当收到这些匣子时,他总要拿出贴身藏着的私钥,
亲自动手打开上面的将军锁。每当看到那将军锁“咔嚓”一声被打开
,唐明皇的脸上就会露出得意的笑容。他知道:
这匣水果的确是原装的,中间没有人动过手脚,
自己今天又能讨得爱妃的欢心了。
这便是公钥和私钥的一种用法。在过去,
这样的设计也许只对极为尊贵的贵族才有意义,
因为普通人连饭都吃不饱,若是有人给你送东西,
你早就乐得屁颠屁颠的,哪管它是不是原装?可社会发展到了今天,
普通草民也要讲究起来了。比如说,我今天买房,
中介要从网上给我寄一份含有敏感信息的文件,
我不希望文件在网上流动时内容被别人看见,
又不想亲自跑一趟去拿。怎么办?很简单,
我可以产生一对电子钥匙,就像前面那样,一个公钥,一个私钥。
私钥我自己留着,公钥我送给中介。
中介用公钥把文件加密后寄给我,我用私钥打开,非常安全。
请注意,公钥被别人偷了去一点儿关系也没有,
因为它只能用来加密,不能用来解密。
公钥和私钥还有另外一种用途,那就是防伪,
还是举一个容易被理解的例子加以说明。
据说现在市面上伪造的茅台酒特别多,
很多茅台酒的忠实客户也开始抱怨,说自己的利益受损,
希望茅台酒厂严格把关。
茅台酒厂领导在听到群众的呼声之后,召开了一个扩大座谈会议,
严肃地讨论了这个问题。在会上,他们一致认为:
群众的疾苦就是我们的疾苦,群众的困难就是我们的困难。
我们一定要开动脑筋,群策群力,
想出一个好办法来保障消费者的权益。
会议最后得出的结论是,他们将为每一瓶茅台酒的瓶口加一把锁。
这些锁一律配有两把钥匙,一把是私钥,由茅台酒厂保管,
出厂前用此钥匙把瓶口锁住。另一把是公钥,
它的设计图纸及制作流程将公布于天下。
一时间,各大企业、商家、小商贩纷纷开始复制茅台酒厂的公钥,
将其卖给喜爱茅台酒的人。
茅台酒厂的领导并不去追究这种山寨自己公钥的行为,
因为他们知道,得到公钥的人越多,假酒就越没有市场,
自己的利益反而会得到保护。果不其然,
当酒厂开始发售被上了锁的茅台酒之后,
人们喝酒前总会拿出公钥去开那酒瓶子。假如打不开,
那肯定是假酒。渐渐地,茅台假酒从市场上销声匿迹了,
酒厂的效益也随之直线上升。茅台酒厂甚至将自己的广告词换成了:
“只有用这把钥匙打得开的酒,才是真正的茅台酒。”
在这里,公钥和私钥发挥了防伪的作用。
当然,在互联网世界里我们同样可以用公钥和私钥实现上述功能,
只不过,这里的钥匙并非金属所制,而是由普通的数字所组成。
任何一对数字,只要它具有下述特性,就可以作为公钥和私钥使用:
如果用其中一把钥匙给信息加密,那么就只能用另外一把来解密,
反之亦然。
数字的确可以起到钥匙的作用,具体例子请见下节。
现在假定我们已经找到符合上述要求的一对数字,
并且愿将其中的一个作为公钥,另一个作为私钥。
有了公钥,我们可以像唐明皇那样,将它遍洒于天下,
让所有人向我们进贡极品。有了私钥,我们就可以向世人证明:
我就是我,如假包换。
这其实正是银行之类的大机构为我们提供的基本服务。
在去银行开账号的时候,我们需要提交身份证明,
银行在验明正身后会给我们一串数字作为账号,
还要求我们想出一个只有自己才知道的密码。这样,
当我们走到这家银行的任何一个提款机前时,
就可以用此密码从自己的账号里提取现金。在这里,
银行起到的作用是什么呢?很简单,
把我们的密码和银行账号这两个数字联系起来。
再想想公钥和私钥吧,不需要社会安全号,
不需要驾照或其他身份证明,
它们本身就可以通过数学算法联系在一起。
既然我们能通过算法和把两个数字安全地联系起来,
那还需要银行做什么!
事实上,私钥和公钥正是比特币这座摩天大厦的坚固基石。
我们所申请到的比特币账号,实际上就是一对数字:私钥和公钥。
为了保证自己的财富不至流失,我们应该妥善地保管私钥,
把它放在最安全的地方。但公钥则是知道的人越多越好:
我们可以用邮件把它发给陌生人,把它印在名片上,
制成二维码随便让人扫描等等。
谁不希望天下的人都往自己的账号里打钱呢?
让我们再次回到区块链里存储的比特币交易记录:
……
区块100
交易1:承接区块99之交易2,自账号Q转10元钱进账号Z。
交易2:承接区块99之交易3,自账号Q转10元钱金账号M。
交易3:承接区块99之交易3,自账号Q转10元钱金账号W。
……
这里的Q、Z、M、W分别相当于老钱、老张、
老马和老王比特币账号的公钥。
再看老张为从老王那里购买烧饼而产生的交易文件:
吾,公钥Z持有者,特授权将区块100第一笔交易所得金额之陆元
整转入账号W,余下四元整转入账号Z (签名)
这个交易文件中出现了两个公钥,一个Z,一个W。从区块100的
第一笔交易记录看,Z的确从Q那里得到过十元钱。
那么怎么保证产生这个交易文件的主人是不是公钥Z的持有者呢?
这就是文件末尾(签名)的重要性所在。
这个签名就像茅台酒瓶子上的那把锁,只有用相应的公钥才能打开。
换个角度来阐述这个问题:你现在要从账号Z往外转钱,
而你声称自己是账号Z的主人并且留下了用私钥Z签好的签名,
那我现在就用公钥Z来验证这个签名。如果验证通过,
证明你的确拥有和Z相对应的私钥,也就证明了你是账号Z的主人。
否则,这个文件的真实性就非常可疑。
这个文件被传到网上后,
所有人都可以根据签名来验证文件的真实性。
在真实性得到确定之后,这笔交易就会被写到区块链中,
成为永久性记录:
……
区块101
交易1:承接区块100之交易1,自账号Z转6元钱进账号W。
交易2:承接区块100之交易1,自账号Z转4元钱进账号Z。
……
至此,老张账号下的6元钱便转到了老王的账号里。而余下的4元钱
,依然保存在老张的名下,虽然它在区块链里的位置改变了。
(待续)