按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
如果使用我们设想的这些神奇加密算法,似乎问题就可以迎刃而解了,但问题是,这样的技术存在吗?听上去似乎并不可能,因为从直觉上判断,知道了加密方法就一定知道解密方法,只需要反过来计算就可以了。加密方法和解密方法是否可能不对称?
有可能!我们来看一个小时候经常在《趣味数学》这类书里看到的数学小魔术:让对方任意想一个三位数,并把这个数和91相乘,然后说出乘积的最后三位数,就可以猜出对方想的是什么数字。比如对方想的是123,那么对方就计算出123×91=11 193,并把结果的末三位193告诉我。看起来,这么做似乎损失了不少信息,我可能没法反推出原来的数。不过,我仍然有办法:只需要把对方告诉我的结果乘以11,乘积的末三位就是对方刚开始想的数字了。可以验证一下,193×11=2 123,末三位正是对方所想的秘密数字!其实道理很简单,91乘以11等于1 001,而任何一个三位数乘以1 001后,末三位显然都不变(例如123乘以1 001就等于123 123)。先让对方用他所想的数字乘以91,假设乘积为X;我再在X的基础上乘以11,其结果相当于我俩合作把原数乘以了1 001,末三位自然就变了回去。X乘以11后的末三位是什么只与X的末三位有关,因此,对方只需要告诉我X的末三位就行了,这并不会丢失信息。知道原理后,我们可以构造一个定义域和值域更大的加密解密系统。比如,任意一个数字乘以400 000 001后,末八位都不变,而400 000 001=19 801×20 201,于是你乘以19 801,我乘以20 201,一个加密解密不对称的系统就构造好了。我们甚至还可以构造一个更大的系统:4 000 000 000 000 000 000 000 000 000 001=1 199 481 995 446 957×3 334 772 856 269 093,这样我们就成功构造了一个30位的加密系统。这是一件非常酷的事情,任何人都可以按照这个方法加密一个数字,但是只有自己才知道怎么把所得的密文变回去。
但如果仅仅按照上面的思路,如果对方知道原理,知道我要构造出带很多0的数,根据19 801和8位算法这两个条件其实可以比较容易地穷举出400 000 001这个目标值。要解决这个问题,我们来看看真实世界是怎么处理的。
RSA算法与椭圆曲线算法
直到1976年以前,所有的加密方法都是同一种模式:
1。甲方选择某一种加密规则,对信息进行加密;
2。乙方使用同一种规则,对信息进行解密。
由于加密和解密使用同一种规则(简称“密钥”),这被称为“对称加密算法”。这种加密模式有一个最大的弱点:甲方必须把加密规则告诉乙方,否则无法解密。这样一来,保存和传递密钥就成了最让人头疼的问题。尤其是人数多了之后,每两个人都要互相商量一个密钥,复杂性大大提高,而传递密钥则带来更高的安全风险。
直到1977年,李维斯特、沙米尔和艾德曼设计了一种算法,可以实现非对称加密。这种算法用他们三个人的名字命名,叫作RSA算法。直到现在,RSA算法一直是应用最广泛的非对称加密算法。毫不夸张地说,只要有计算机网络的地方,就有RSA算法。这种算法为什么这么晚才出现?或许类似的技术一直隐藏在“二战”的迷雾中不为人知。
这一非对称加密模式的流程如下:
1。乙方生成两把密钥(公钥和私钥)。公钥是公开的,任何人都可以获得,私钥则是保密的。
2。甲方获取乙方的公钥,然后用它对信息进行加密。
3。乙方得到加密的信息后,用私钥解密。
由于公钥加密的信息只有私钥解得开,因此只要私钥不泄露,通信过程就是安全的。
RSA算法为什么更加安全呢?在数学世界里,有一些公认的、需要消耗极大计算量才能得出结果的难题,比如大数因式分解问题、离散对数问题、椭圆曲线问题。RSA算法正是用到了大数分解这一相当犀利的不对称难题。比如对于我们上面构造过的30位加密系统:
4 000 000 000 000 000 000 000 000 000 001=1 199 481 995 446 957×3 334 772 856 269 093
反过来算乘积非常容易,但是要把4 000 000 000 000 000 000 000 000 000 001分解成后面两个乘数,在没有计算机的时代几乎不可能成功!而一旦数字长达数百位,即使是超级计算机也需要耗费海量的时间来计算才有可能,下面给出两个近年来的大数分解记录。
大数因式分解记录RSA200,一个共有200位的非特殊数字,在2005年,计算机花了18个月时间才把它分解成两个素数。2007年3月6日,一个国际组织打破了这个保持了两年之久的纪录,来自3个机构(洛桑联邦理工学院、波恩大学、日本电话电报公司)的计算机集群在经历了11个月的计算后,终于成功地把一个有名的很难分解的大数——2^1039…1分解为素数因子。消息爆出后,一个匿名人士在网上贴出了下面的等式:
2^1039…1=p7×p80×p227
p7=5 080 711
p80=558 536 666 199 362 912 607 492 046 583 159 449 686 465 270 184→ ←886 376 480 10052 346 319 853 288 374 753
p227=207 581 819 464 423 827 645 704 813 703 594 695 162 939 708 007→ ←395 209 881 208387 037 927 290 903 246 793 823 431 438 841 448→ ←348 825 340 533 447 691 122 230281 583 276 965 253 760 914 101→ ←891 052 419 938 993 341 097 116 243 589 620 65972 167 481 161 749→ ←004 803 659 735 573 409 253 205 425 523 689
其中p7是已知的,p80×p227则大概是人类已经分解的最大整数(307个十进制位)。
椭圆曲线算法(ECC)则是另一种著名的非对称算法,在比特币体系里占据重要地位,是比特币钱包安全性的密码学基石,也是比特币被称为密码学货币(Cryptography)的原因。
ECC各方面的性能和RSA比起来几乎完胜:
1。安全性能更高。比如160位ECC与1 024位RSA有相等的安全强度。
2。计算量小,处理速度比RSA快得多。
3。存储空间占用小。密钥尺寸和系统参数与RSA相比要小得多。
4。带宽要求低。
ECC的这些特点使它逐渐取代RSA,成为通用的公钥加密算法。
比特币初接触:客户端的使用方式
客户端下载
首次使用比特币需要先下载客户端,可以在//bitcoin上选择不同种类的钱包软件。目前,钱包软件包括电脑钱包、手机钱包和在线钱包。从易用性和传承性的角度考虑,这一部分将以最早出现的客户端Bitcoin…QT为例。
下载、安装后,Bitcoin…QT首次运行时需要花费一段较长时间进行数据同步,目前同步的数据量在10G左右。之所以有这么大的数据量,是因为Bitcoin…QT会下载比特币有史以来的所有交易记录(有些轻量级客户端可直接从网络实时查询结果,无须同步如此庞大的文件)。待数据同步完毕,“余额”和“未确认”项显示的数据就是最新数据。
比特币地址
将Bitcoin…Qt切换到“接收”菜单,可以看到软件已经自动生成了一个地址,那一长串乱码般的字符就是我们的收款账号。至于这一长串东西是什么意义,凭什么作为账号,后文会统一回答。
比特币支付
为了支付,我们需要创建一个目标地址。可以在“接收”菜单下通过“新建地址”功能直接创建一个标签为“test”的新地址。然后,在“发送”菜单下填上新创建的地址和要发送的金额,点击“发送”,这笔“钱”就发出去了。待网络确认完成,将发送到我们的新账户“test”上。在“交易记录”菜单下就可以看到我们的操作记录以及网络确认次数,当确认次数达到6次,此次交易便宣告成功。
如果需要用手机钱包支付,手工输入这么一长串地址显然是令人担心的(其实输入错误肯定无法发送成功,因为错误的地址无法通过特定的算法验证)为解决这一问题,Bitcoin…QT提供了二维码的操作方式,直接用“接收”菜单的“显示二维码”功能就可以另存为图片并把二维码发给对方,让对方通过手机扫描的方式直接支付,甚至可以直接填上希望支付的金额并生成带额度和消息的二维码。
因为每个比特币地址上的金额流水全部是公开的,如果希望保密或者区分不同的付款人,可以为每个人单独生成一个地址并提供给对方,而不是像现实银行账户那样,要求对方增加一个尾数用于确认。在这里,每个人都可以为自己创建任意数量的账户(地址)。
备份钱包
比特币的钱包数据是保存在本地电脑上的,万一出现系统崩溃或者中毒事件,导致数据丢失该怎么办?Bitcoin…QT提供了钱包文件备份功能,点击“文件”菜单下的“备份钱包”就可以把钱包文件导出,保存到安全的地方。而恢复钱包也比较方便,只需把备份文件拷贝回上面的目录,重新打开Bitcoin…QT就可以看到备份钱包中的金额了。
加密钱包
在通常情况下,如果你的钱包文件被别人拿到,那么对方将拥有你所有额度的绝对支配权。这太危险了,尤其是当电脑中毒时。
Bitcoin…QT同样考虑到了这个问题,其应对之策就是支持给钱包加密。在“设置”菜单下的“加密钱包”选项里可以设置密码,钱包加密功能会保护所有在该钱包中生成的比特币账号。这个密码类似支付宝的支付密码,付款时需要输入,这样即使对方偷走了钱包文件也只能看余额而不能转账。
比特币再深入
上面简单介绍了比特币的使用,接下来,我们会思考一些更深入的原理问题,比如在一个没有中心的系统中如何产生有中心的效果,并将看到前面大段的密码学知识是如何建立起整个比特币系统的。
去中心化思想
百度百科“比特币”词条是这样定义比特币的:比特币是一种由开源的P2P(Peer…To…Peer,点对点)软件产生的电子货币,是一种网络虚拟货币。比特币不依靠特定货币机构发行,它通过特定算法的大量计算产生,比特币经济使用整个P2P网络中众多节点构成的分布式数据库来确认并记录所有的交易行为。P2P的去中心化特性与算法本身可以确保无法通过大量制造比特币来人为操控币值。
这段描述充斥着计算机技术界的行话,但其最核心的思想很清晰——去中心化。去中心化的意思就是不由某个人或某个群体主导一切,而是大家集体参与、共同决定。在沟通方式低效的年代,这是一件非常奢侈的事情,但由于能够保障所有人的权利、及时纠正可能的错误,所以人类社会形态也遵从这个思想,从中心化不断迈向去中心化。
进入互联网时代,由于沟通的便利性得到极大提升,去中心化思想开始在各领域迅速扩张,任何人都可以在网络上表达自己的观点或创造内容。比如在读这本书时,你可能就一边翻着百度百科的词条,一边在豆瓣书评里吐槽,同时还可能在微博里搜索别人是怎么评价比特币的。总而言之,在去中心化的世界里,所有人都是平等的,你可以给9分的电影打2分,但无法因此把9分拉低到哪怕8。9分;你可以宣