写给大家看的公钥加密算法原理

相信很多朋友和我一样,都有传递情书的经历。在我中小学那个还没有陌陌的时代,写纸条应该算是与女同学建立感情的最佳手段——至少是之一。

既然是传递纸条就难免会假他人之手,尤其是在上课这种不方便走动,班主任又有意把长得有夫妻相的男女生分在不同角落的情况下。是以这种原始的通讯手段虽然能使大名鼎鼎而或臭名昭著的「棱镜」计划丧失用武之地,但却躲不过最原始的监控手段——直接打开看。中国人好奇心最大的地方莫过于别人的私生活,可以想象纸条上不可能有什么秘密存在,肉麻的情话最终往往会成为大家的笑柄。如何才能有效传递情书,但又不让情书的信息在传递过程中泄露出去就成了困扰我很长时间的问题。

我想到的第一种方法是,用密码的形式写情书。每五位数字代表一个字,前三位数字代表该字在新华字典的页码,后两位数字代表该字在这一页的第几个。新华字典是当时学生必备,只要事先约定好,我们就可以用这种方式沟通。但这一听就是一种找抽的方式。我的第一封密文情书大约一百个字,写了一节课还没写完。更糟糕的是,小姑娘收到情书之后,又花了两节课时间破译,等破译完之后,你的情书内容已经不重要了:一个精疲力尽的人往往会丧失各种欲望。好在她觉得这种加密方式很好玩,并没有觉得心烦,但我却再也不敢尝试第二次了:女人心烦往往连理由都不需要,我就别硬塞一些理由给她了。

第一种方法宣告不可行之后,我想到了一种更原始的方式。我找个可以锁上的小木盒,把情书放在木盒子里传递。这个方式可以称之为找抽方式之二。完美的解决的加密的问题,同时也通过一个在课堂上传递的盒子告诉了老师,你们俩之间有亲密关系。老师是一种比猫还多疑的动物,又不像猫一样温顺,踢一脚就乖乖卧在角落里思考人生——正相反,挨踢的往往是你。

不过这种新型找抽方式让我想到一种类似的解决方案。当时市面上刚好出现一种带密码锁的笔记本,我们只要预先沟通好密码,完全可以在这个笔记本上传递消息,同时这个笔记本还能成为我们俩爱情的见证。可惜年幼无知的我上当受骗了,买回来没多久我就发现这个密码锁只能算是一个装饰。它的加密装置是上下两组a到z字母,所谓密码就是特定两个位置的组合,也就是说最多试二十六次就可以把密码试出来。顺便提一句,这种把密码所有可能性挨个试过去的破解密码方式叫做暴力破解法。这种方式是最笨最原始的破解密码方式,但理论上可以破解任何密码。就这个只有二十六组可能性的密码而言,用纯手工的方式,暴力破解连一分钟都用不了。想想我初中那个爱在学生不在的时候搜查学生抽屉的班主任是精通概率论的数学老师,我就吓出一身冷汗。

刚被骗的人往往会比较聪明,所以我一下子想到这其实并不是加密方式的问题,而是选错了密码锁的问题。于是我拿出当时仅有的一点积蓄,买了一个四位数字加密的密码锁,替换了原来的锁。如前面所说,暴力破解当然是有可能的,但帮忙传递情书的人不太可能在短短几分钟内把密码试出来,毕竟你帮别人传递东西,不好意思把这东西拿在手上试一两个小时。若破译密码的时间超过某一个我们认可的有效时间,我们就说这种密码是「实际上」无解的。从这个意义上讲,「爱你爱到死」和「爱你一万年」可以认为是一个意思,尽管事实上人的寿命和一万年是两个不同的时间段。举个其他例子,战场上用密码加密了明天的作战计划,但要破译这份密码需要三天时间,这时这个密码就可以认为是实际上无解的。因为三天后这个作战计划早已经不是秘密了。我们加密一个东西,一般来说,只需要这个密码实际上无解即可。

就这样我用一种相对较简单的方式加密了我们的传递情书过程,同时也在事实上避免了暴力破解密码的可能性。但有时候破解密码根本不需要暴力。当时几乎所有的密码锁都有一个特性,无论开还是锁,都需要先把密码对到正确的位置上。这样我的同桌只要一不小心扫一眼我锁笔记本时候的密码状态,然后再一不小心给其他同学一讲,密码立刻又形同虚设。这时,我不免会想,有没有一种新的方式能够解决掉这个问题?

一个理论上的解决方案是,我上锁的时候用一组密码(密码A),对方开锁的时候用另一组密码(密码B)。密码A只负责上锁,密码B只负责开锁。这样的话,即使密码A被所有人都知道了,也只能望洋兴叹。尽管我当时没有找到这样的密码锁卖,但是这样的加密解密方法在生活中已经无处不在了。如果你留意的话,你会发现这种新的加密解密方法与前面提到的所有的方法都有一个显著的不同:前面提到的所有方法, 你一旦了解了加密规则,也就知道了解密规则, 加密解密都需要一个共同的密码,这样的加密方式我们称之为「对称加密算法」;而最后提到的这种方法,加密和解密要使用两套不同的规则,即使加密规则(密码A)被所有人知道了,如果不知道解密规则(密码B),也对破译密码无可奈何,这种方式我们称之为「非对称加密算法」。我们假设甲乙两人之间利用这种「非对称加密算法」传递信息,这种算法的原理可以表述为:

甲有两把密钥(可以想象为例子中的密码),我们称之为公钥(密码A)和私钥(密码B)。公钥是公开传递的,所有人都可以或者至少有机会获得;而私钥是保密的,只有甲一个人知道。

乙从甲处得到公钥,并利用公钥对所传递信息加密。

甲得到乙加密的信息后,利用私钥解密以获取原始信息。

由于加密使用的是公钥,所以「非对称加密算法」又称「公钥加密算法」。这种算法可以说是远距离传输私密信息的基石,在互联网(尤其是电子商务)上得到了广泛的应用,几乎任何需要传递保密信息的领域都少不它的身影。可以说只要你上过网,几乎就一定接触过这种算法。目前最流行的公钥加密算法是「RSA加密演算法」,大名鼎鼎的google数字证书以及Gmail等服务用的就是这种加密演算法。而比特币的加密机制基于「椭圆曲线加密算法」,相比RSA,同等大小的密钥可以提供更高的安全级别。也就是说,如果你信任google的加密系统,那么对于比特币的加密机制也大可放心。