纪念首次应用非对称加密1周年
今天是个值得纪念的日子。1972年的今天,HP公司推出第一个科学计算器;1995年的今天,苹果公司开放Macintosh授权;2000年的今天,比尔盖茨将Windows CE改名Pocket PC;2001年的今天,Linus发布了Linux 2.4操作系统内核;2009年的今天,中本聪创建了比特币。当然,本文的重点并不是这些,而是密码学。
首先澄清一下一般人对密码的误解。假设有两种情形:A、小明在某个网盘创建了一个账号,并对这个账号设置了“密码”。B、小明将他喜爱的小视频变成压缩文件(例如.rar文件),并设置了密码。情形A不属于密码学的范畴。
在情形A中,小明设置的“密码”并非密码学意义上的密码,亦不是下文将要探讨的密码,网站的“密码”叫做口令更为恰当。换言之,小明传到网盘上的文件并没有使用他设置的“密码”进行加密,而是被原封不动的传到了网盘公司的服务器上,而他设置的“密码”只是起到验证身份的作用,用以向公司证明账号是他的。一旦他忘记“密码”,可以用找回密码功能重置他的“密码”,而不会导致他上传的文件无法获取。下图是一种典型的网站登陆界面:
问题在于,既然文件没有加密而是原封不动的传到了公司的服务器上,就意味着公司内部诸多有权限的人都可以任意查看、删除和篡改你传上去的文件。不但公司内部人士可以,黑客、合作公司等均可查看,万一将来哪一天得罪了这些人,他们完全可以把你的黑历史捅到你的社交圈内,产生的影响自己评估。由于难以精确定位信息泄露的源头,对这些坏份子的惩治几乎只存在于法理上。这种事情已经多次发生,并将继续发生。
在情形B中,小明设置的密码因为参与了文件的加密,是真正的密码,也是下文将要提及的一种密码学方案(对称加密)。经过加密以后,只有知道密码才能够打开文件。现代密码算法充分考虑到了计算机算力的问题,只要密码不是过于简单或者是太短(比如123456),基本可以认为以现有的技术无法在你的有生之年破解。
当然,一旦你忘掉了密码就非常麻烦了,密码学意义上的密码一旦丢失无法找回,一旦泄露无法重置。当你忘掉了密码的时候,用来保护你文件安全的加密算法就会反过来变成阻挡你取回这个文件的铜墙铁壁。若是密码过于简单还有可能通过暴力破解的方案找回密码,而密码复杂起来以后,你的文件将被锁死在这个压缩包内,可望不可即。
常见的加密算法包括对称加密和非对称加密,正常人听了一定是一头雾水,不过没关系,我们循序渐进的讲一下概念,本文不涉及任何公式。
对称密钥算法(英语:Symmetric-key algorithm)又称为对称加密、私钥加密、共享密钥加密,是密码学中的一类加密算法。这类算法在加密和解密时使用相同的密钥,或是使用两个可以简单地相互推算的密钥。事实上,这组密钥成为在两个或多个成员间的共同秘密,以便维持专属的通信联系[1]。
情形B提到的压缩包加密就是一种典型的对称加密算法。压缩包的加密过程和解密过程使用的是同一个密码,例如你用“123456”来加密小视频,那么也只有“123456”可以将这个小视频解密。当你想要分享这个小视频的时候,你可以直接把加密后的压缩包传到你们班级的群里,然后线下当面告知你的狐朋狗友这个文件的密码,其他人由于不知道这个密码,就算下载了文件也毫无用处,同样,其他能够截获这个文件的人,也因为不知道密码而无法打开文件。这个密码成了你们之间的共同秘密,只要你们自己不作死把密码传到群里,就不会社死。下图为Winrar软件加密的效果(勾选了加密文件名):
笔者早在十年前就使用对称加密算法来加密黑照了;五年前使用True crypt对称加密软件对自传“高考标准零分作文”进行了加密,并小范围线下分享了密码,持有密码的同学人品非常可靠,是值得信赖的(虽然这不代表他们的密码管理水平可靠);两年前跟同学合作设计了一颗AES对称加密芯片并通过了流片验证,总共有一千多万组测试向量,结果全部正确,是笔者第一次尝试实现硬件层面的加解密。下图分别是常用的加密软件Vera crypt和笔者参与设计的一颗AES加密芯片:
对称加密能够有效的保证信息安全,但是仅有对称加密还不够。回到分享小视频的例子,很关键的一步是你要线下告诉朋友这个压缩包的密码,只有这样你的朋友才能够打开这个文件。问题来了,当你和你的狐朋狗友没法见面,只能通过电话,QQ,微信聊天的时候,该怎么告诉他密码呢?
一般人会自然的想到,这不简单,打电话或私聊就行了,too young too simple。第三段中的情形A已经指出,你传到公司服务器上的信息可都是明文的,也就是说你把密码拱手相让给了一大群人。那么很好,有一天你们的通话录音或聊天记录被泄露了,你社死了,然后你以为是你朋友干的,去找他兴师问罪甚至绝交,殊不知他也是受害者,可是非常naive了。那个躲在幕后的偷窥者(兼你的竞争对手)看着你们分道扬镳,嘴角流露出了猥琐的笑容。
这个时候,你需要告诉朋友这个压缩文件的密码,非对称加密算法就派上了用场。前面指出,对称加密算法的加密过程和解密过程使用了同一个密钥。而在非对称加密算法中,加密和解密的密钥是不相同的,并且两个密钥之间互相无法推导。信息用public key加密以后,只有对应的private key才能够解密;而private key也只能解密由对应的public key加密的信息。
公开密钥密码学(英语:Public-key cryptography)也称非对称式密码学(英语:Asymmetric cryptography)是密码学的一种算法,它需要两个密钥,一个是公开密钥,另一个是私有密钥;公钥用作加密,私钥则用作解密。使用公钥把明文加密后所得的密文,只能用相对应的私钥才能解密并得到原本的明文,最初用来加密的公钥不能用作解密。由于加密和解密需要两个不同的密钥,故被称为非对称加密;不同于加密和解密都使用同一个密钥的对称加密。公钥可以公开,可任意向外发布;私钥不可以公开,必须由用户自行严格秘密保管,绝不透过任何途径向任何人提供,也不会透露给被信任的要通信的另一方[2]。
和对称加密相比,非对称加密有点反直觉。一言以蔽之,非对称加密最显著的特性是具有两个密钥:一个用于加密,一个用于解密。两个密钥形成一个密钥对,只有一起使用才能完成加解密。典型的非对称加密算法有RSA和ECC,都是图灵奖成果。
使用非对称加密时,首先要生成一个密钥对,密钥对包括加密使用的public key和解密用的private key,两者之间相互关联但是互相无法推导。然后,你朋友把public key通过公开渠道(比如电话,私聊,群聊)发给你,你用这个public key来加密你的压缩包密码。通过public key加密的信息再返回给你的朋友,他用自己的private key解密,就得到了压缩包密码。
审视这一过程,你和朋友需要在公开渠道进行两次通信。第一次是你朋友把public key发给你,前面说过,无法由public key推导出private key;第二次是你把加密后的压缩包密码发给你的朋友,这个加密后的信息只有你朋友的private key可以解密,其他的人即使截获了加密信息也不能够解密。整个过程中用于解密的private key都在你朋友自己手上,从而保证了秘密不会泄露。常见的非对称加密软件有OpenSSL,PGP等。下图是一个示范性的RSA演示软件,N是public key,D是private key:
N是两个大质数的乘积。D也是由两个大质数经过一定运算得到的。N可以唯一的分解成两个大质数,由这两个大质数计算可以得到D,但是质因数分解异常的消耗时间,现在没有找到简便的算法。笔者认为,找到质因数分解公式的难度,可能和证明哥德巴赫猜想的难度类似,需要数论领域的重大突破。关于RSA的数学推导,可以参考阮一峰的博客[3],亦可在GitHub上找到源代码。
当然非对称加密也存在一些问题,最常见的莫过于中间人攻击。即中间人篡改了你们的通信内容。例如,攻击者将你朋友的public key替换成自己的public key发给你,你用攻击者的public key加密后,攻击者就能够用自己的private key解密你的信息,然后再用你朋友的public key加密后发给你的朋友。在这个过程中,信息就被泄露了。不过中间人攻击也可以避免,只要确认你朋友发给你的public key和你收到的public key是同一个就行了。加解密设备的安全性也是一个问题,不过对于一般的保密程度,不安装流氓软件就足够了,若加密级别实在过高,则有必要保证存有私钥的电脑不接触网络。
但是,一年之后发现,非对称加密的意义并没有如此重大。主要原因是实在是没有什么信息是非得线上分享不可的。高级别的秘密有对称加密保驾护航,低级别或仅是有时效性的秘密也一般懒得加密。少数的几次非对称加密聊天无一例外泄露了海量的个人隐私,这些信息按照分级加密准则是绝无可能出现在网络上的。但是从分享的效果上来看远远不如当面谈论,这更加限制了非对称加密的应用场景。不过,我可以不用,但不能没有!
在首次应用非对称加密一周年的时间节点上,谨此纪念曾经为了保护信息安全而投入海量时间资源的笔者。后面可能会多写一些有关频率产生与综合的博文,希望有兴趣的同学一起讨论。
参考资料:
1、Delfs, Hans & Knebl, Helmut. Symmetric-key encryption. Introduction to cryptography: principles and applications. Springer. 2007 [2014-01-20]. ISBN 9783540492436.
🐮啊🐮啊
回复删除太精彩了
回复删除