《比特币一个虚幻而真实的金融世界全集.com》第13/37页
传统密码世界一直需要面对这样一个看似死循环的无解问题。这里我们有两种思路可以尝试解决。
第一种,专门设计一个秘密的加密算法,使对方即使拿到密码也没有办法解密。如果是绝对的军事需求、能邀请高水平的数学家来确认算法的安全性,这样确实没有问题。但如果是互联网通用技术,如果不公开算法的细节,恐怕没有人肯使用。密码学世界有一个柯克霍夫原则:即使密码系统的任何细节已为人熟知,只要密钥(key)未泄露,它也应是安全的。无论是在战争时期还是和平时期,都不能把保密的希望寄托于系统或算法的秘密性。机械可以拆解,软件可以反编译。密码系统的所有细节总会被有心人一一拆解。这个时候,如果系统符合柯克霍夫原则,那么即使对手拆解了系统但不知道密钥,他也没有办法破译加密的信息。满足这种严苛条件的密码系统才是安全的。
第二种方法更绝。要是有一种加密系统,加密和解密使用不同的密码,假设有2个密码A和B,使用A对数据M进行加密得到加密数据X = F(A,M)。但是,知道A和X无法解密出M,必须用另一个密码B使得数据还原M = F(B,X)。爱丽丝只需公布密码A,鲍伯使用公开渠道拿到的A对情报进行加密,再通过任意方式发给爱丽丝进行解密,这样一来,即使所有的通信被监听,对手也不可能拿到情报。当然,这里依然有一个缺陷,即鲍伯如何确定自己拿到的密码A确实是爱丽丝给出的,而没有被别人替换掉,不过这是另一个关于可信认证的话题,暂时不在这里讨论。
如果使用我们设想的这些神奇加密算法,似乎问题就可以迎刃而解了,但问题是,这样的技术存在吗?听上去似乎并不可能,因为从直觉上判断,知道了加密方法就一定知道解密方法,只需要反过来计算就可以了。加密方法和解密方法是否可能不对称?
有可能!我们来看一个小时候经常在《趣味数学》这类书里看到的数学小魔术:让对方任意想一个三位数,并把这个数和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 100\52 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 208\387 037 927 290 903 246 793 823 431 438 841 448→ ←348 825 340 533 447 691 122 230\281 583 276 965 253 760 914 101→ ←891 052 419 938 993 341 097 116 243 589 620 659\72 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,成为通用的公钥加密算法。
比特币初接触:客户端的使用方式
客户端下载