按:本文作者Song,雷锋网专栏特约作者,西雅图Newsky Security公司联合创始人兼CTO,业内知名防病毒专家,黑客。
最近在媒体上常常曝光的一个名词是勒索软件。勒索,就是劫持了你在意的人或者东西,然后让你交钱的一种犯罪行为。
最早的勒索方式是:“你的鹅纸在我们手上”;
在数字时代,勒索方式是:“你的裸照在我们手上”。
不过,目前流行的勒索软件不是这样,拿你东西?那不是太老土了。勒索软件的黑客们才不拿你的东西,他们是先用某种方法把软件放到你的计算设备上,比如你的电脑,你的手机或者你的平板电脑,然后把你的数据加密——明天要交给老板的PPT变成了一坨乱码,跟辛辛苦苦积攒了好多年的小黄片一起,没法看了。想把数据解密?交钱!
加密是计算机科学中历史最长久的一种计算了。早在二战时期,德国就制造了Enigma密码机,来传输机密信息。计算机科学的祖师爷之一图灵也参与了对Enigma密码的破译工作。Enigma密码机的原理,是对每个字母进行转译,变换成另外一个字母,而机器的结构保证字母不是总是被转译到另外一个字母。这在当年是非常先进的一种做法,不过,这种加密中,字母和字母还是有对应关系的,所以在破译密码的过程中,一些常见的短语,比如纳粹经常挂在嘴边,对希特勒表忠心的话,就被用来作为解密的入手点。所以呢,神盾局特工里面,九头蛇组织是必然会失败的,就是因为他们话太多了。
(Enigma密码机的插线板 图片来源:维基百科)
在现代加密算法中,这种字母对字母的对应早已经被跨字母边界的算法取代。如果把每个byte作为一个字母的话,现代加密算法会把一串二进制数据进行加密,而不是对单个byte进行加密,进一步增加了解密的难度。
现代密码学里面很多的加密算法是对称的。所谓对称算法,就是加密的秘钥和解密的秘钥是一样的。
加密算法通常是经过长期研究,保证了加密的有效性,也是公开的。那么区分不同加密手段的,除了算法,就是秘钥了。如果加密算法是对称的,一旦秘钥被敌方知道,所有的加密通信就可以被解开。这就造成了一个难题:比如小明要给小红写情书,为了不让班主任看懂,小明需要把情书加密,但是小红为了看懂情书,就需要秘钥。小明怎么把秘钥给小红呢?写在小纸条上吗?
如果班主任看到了小纸条上的秘钥,那就可以免费看几个月的爱情韩剧了。这种时候,小明通常会选择用另外一个信道给小红传输秘钥。比如给小红寄一封信,或者放学以后偷偷把写着秘钥的小纸条交给小红。但是,秘钥还是有泄露的可能性。另外,很多时候这种第二信道不一定存在,或者不一定现实。比如我们要上网买东西,这个时候谁等得及让网店先寄一封写着秘钥的信来呢?
写勒索软件的黑客同样面临这个问题:他们的勒索软件要把用户的数据加密,就需要有算法和秘钥。算法是写在软件里面的,软件通过网络下载到用户的电脑上,算法是可以被逆向工程解出来的;秘钥也要传递到用户的电脑,也会被记录下来。如果秘钥和对称加密算法都被人知道了,很快就会被人做出解密软件来,勒索的事情就和小明的爱情一样,成了空。
那么,有没有一种加密算法,能在算法和秘钥都可能在唯一可用的信道上通信,并且很可能被公开的情况下,保证加密的可靠性呢?有的,这就是非对称加密算法。
如果说加密算法是把数据放到一个保险箱的话,对称加密算法的秘钥,就是既能锁保险箱,又能开保险箱的钥匙,而非对称加密算法,则是锁保险箱是一把钥匙,而开保险箱,是另外一把钥匙。RSA算法,就是这样一种非对称加密算法。
RSA是1977年由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的。当时他们三人都在麻省理工学院工作。RSA就是他们三人姓氏开头字母拼在一起组成的。1997年,解密了一个文件。早在1973年,在英国政府通讯总部工作的数学家克利福德·柯克斯(Clifford Cocks)在一个内部文件中提出了一个相同的算法,但他的发现被列入机密。如果不是因为他在机密单位工作的话,我们现在就是在讨论CC算法而不是RSA算法了。
虽然RSA算法的数学表达非常优美,但是根据一篇文章每增加一个公式,读者就会减少一半的原则,我们这里就不写公式啦。
非对称算法的原理都是基于这样一个原理:对于一个加密的信息,哪怕你买了世界上最强大的计算机,在有生之年也别想算出解密的秘钥。非对称加密算法,就是选择了一个难解的问题,围绕它建立加密/解密体系。RSA选择的难题,是分解一个大数的质因子。
要说质数,简直就是数学界的点金石,多少猜想和算法都来源于质数。这里,请允许我向数学家陈景润和张益唐致敬。
我们还是回来说小明和小红的爱情故事吧。如果小明和小红选择用RSA算法来对他们的情书进行加密,首先要用软件生成各自的公钥和私钥,然后他们各自把自己的私钥藏好,把自己的公钥大大地写在教室的黑板上。当然,这里两个秘钥哪个作为公钥,哪个作为私钥其实是没关系的,公开的那个就是公钥,保密的那个就是私钥。如果小明要给小红写情书,他会用小红的公钥给情书加密,再发给小红。小红收到以后,用自己的私钥,就可以解密了。那么班主任老师看到的是什么呢?是一团乱码。没有小红的私钥,班主任老师哪怕用世界上最强大的计算机,也没有办法在一百年内算出情书里面写的是什么。
同样的,如果一个写勒索软件的黑客,想要防止被人破解,他同样可以用RSA加密算法对受害人的数据进行加密,而使用的秘钥可以是网络上面下载的公钥,等用户付款以后,把私钥发给勒索软件进行解密。不过,如果你以为读懂这点就可以到网上去抄一个勒索软件来赚钱的话,我建议你还是先跟家里人讲好,怎么从局子里面捞自己比较好,不然等你被放出来,小明已经要向小红求婚了。
为了纪念多年来和班主任老师的斗智斗勇,小红决定让小明证明求婚是认真的,是来自小明而不是后援团的。这倒是也难不倒小明,他先把求婚的话用自己的私钥加密,再把加密过的信息用小红的公钥加密,这样,小红拿到这团乱码,先用自己的私钥解密,再用小明的公钥解密,就可以看到小明的话。而且,因为最后一步解密是用小明的公钥解密的,说明这个信息是来自小明,而不是其他人。
注意这里有点绕,通常我们是用公钥加密,私钥解密。但是这里进行了两次加密/解密过程,在内层,是用小明的私钥加密的。因为私钥和公钥都可以用来加密,只要用另外一个进行解密就可以了。小明和小红的这种传递信息的方式,不仅传递了信息,也确定了信息的来源,这种方式叫做数字签名。
前面说了,RSA算法只是非对称加密算法的一种,目前比较流行的还有椭圆曲线加密算法,也是一种非对称加密算法。相对RSA算法,椭圆曲线算法在相同秘钥长度的情况下,能提供更好的加密强度。不过目前最流行的非对称加密算法,还是RSA算法。就在你刚才去登录邮箱,或者网上购物的时候,RSA算法还在https协议中,保护着你的隐私和网上财产。比如,小明和小红结婚以后很快有了一个可爱的女儿,在给女儿买尿布,上网交学费的时候,RSA算法都在保护着每一个划过空中的比特,不会被咖啡馆另一边,或者世界另一边的黑客破解。
(公钥/私钥的加密/解密过程,无论是传情书还是买尿布,都需要。图片来源:微软MSDN)
几年后的一天,小明对小红说:亲爱的,有一个好消息和一个坏消息,你想先听哪个?
哪个都好,小红温柔地说。
首先,小明缓缓道来,我们的孩子,用RSA加密,给她幼儿园的同学发了一封信。
那另一个消息呢?小红笑眯眯地问。
她的老师把这个消息解密了。
啊!小红不禁掩住了嘴,你是说,量子计算机?
是的,小明点点头。
注:头图和第一张图来自 gfi.com。