用 PGP 保护邮件(邮件加密和签名)

大约半年前,或者是一年前,我得到 某人(应某人要求匿名了) 的建议,开始使用 PGP 对邮件进行加密。所谓的 PGP 全称是 Pretty Good Privacy (意:很好的隐私哦~),原本是一个软件的名称,不过现在看来已经成为邮件加密和签名的标准了。

给邮件加密和签名的好处

在使用天朝公司提供的电子邮箱时,谁都不知道我们的邮件内容是不是没有被检查。连 QQ 都会对关键字进行过滤(不信的话请试图使用 QQ 向好友发送敏感词,多试几个总会试对的),邮件的话想必应该也会有相应的机制。于是我们就不能放心地在邮件中讨论糟糕的话题了,说不定哪天不明真相的相关机构人员就会请你去喝茶。但是,如果把邮件加密的话,相关机构的人再怎么厉害也不可能看到邮件内容了。

在使用一些敏感服务的时候,服务商一般都会通过电子邮件来发送通知。但是我们如何知道一份通知真的是服务商发出的呢?要伪造一封电子邮件并不是什么困难的事情。有了邮件签名,就不用费脑筋去检查一封看似可疑的邮件是不是服务商发来的了。只要确认邮件的签名是服务商签署的,那就可以确保这个邮件是服务商发送的,而不是伪造的了。

我在使用 PayPal 的时候就遇到过这个问题。PayPal 似乎不会给用户发送带有自己签名的邮件,而他们发来的邮件却又像一封欺诈邮件,当时我看了那邮件很久,然后点击了邮件中的连接(是 PayPal 的链接),最后才确定那封邮件确实是 PayPal 发来的。就是不是 PayPal 发来的,我最后也是去了 PayPal 的官网,骗子奈何不了我。实际上到现在我都还不确信那封邮件是 PayPal 官方发送的。

我记得以前在找域名注册商的时候就看到有一个服务商是提供了自己的 PGP 公钥的,用户可以选择是否让服务商签署发送给用户的邮件,以确保邮件是服务商发出的。这个就很好嘛,收到诡异的邮件也不用费劲脑筋去确认这个邮件是谁发来的了。

PGP 使用了非对称加密方法来实现邮件的加密和签名,非对称加密确实是一个很好的加密方法,特别是在两人没法很方便地交换信息的时候。非对称加密可以让双方不使用相同的密码就能实现消息的加密以及签名。双方只要事前知道对方的公钥就可以了。

非对称加密的过程

据猜测这个脖子可能受到相关机构人员的重点监视,所以为了表明立场,我决定不使用密码学中常用的爱丽丝和鲍勃做为演员名字,改用具有中国特色社会主义的小明、小红和小刚这三个名字来演示。小明和小红是合法用户,希望加密他们之间的通信,而小刚是一个邪恶分子,一心想破解小明和小红之间的加密通信。

现在小明有一封信,希望送给小红。因为小明和小红不在同一个城市,所以小明决定通过天朝邮政将信给小红寄过去。但是天朝邮政的口碑是差了出名了,普通邮件经常丢失。对小明来说,信件丢失没关系,只要复印一份留着就行了。小明担心的是天朝邮政的工作人员会不会偷看他的信件。为了保密,小明决定不使用平邮,而是将信件装进一个盒子里面,然后用一个锁头锁起来,再通过普通包裹寄给小红。锁头的钥匙在小红手上,盒子和锁头的防盗性能非常好,基本上可以认为除非有钥匙,否则根本无法打开盒子。这样,小明就可以安全地把信件通过不可靠的天朝邮政寄给小红了。

为了完成这个通信过程,首先需要小红制造一把锁头和与之配对的钥匙。然后,小红保管好钥匙,再做很多个相同的锁头,并把锁头寄给小明。小明收到锁头以后,用这个锁头把盒子锁起来,把盒子寄给小红。小红收到盒子之后用锁头对应的钥匙把锁头打开,这样就得到了小明的信件。

在这个过程中,信件是很安全的。首先,锁头只有小红的钥匙才能够打开,而且具有足够的安全性,别人几乎不可能根据这个锁头制造出一个可以打开锁头的钥匙。小明使用的盒子也是非常坚固的,除非打开锁头,否则是无法打开盒子的。这样,在小明用小红的锁头锁上盒子之后,盒子就只有小红才能打开,其他人都没法打开盒子,包括天朝邮政的工作人员。这样小明和小红就可以很放心地通信,而不用担心信件被别人偷看了。

在非对称加密体系中,小红制造出来的锁头和钥匙成为密钥对,一个密钥对包括一个公钥和一个密钥。公钥相当于锁头,可以随意公开。私钥相当于钥匙,必须保管好,不能让别人得到。在现实的加密过程中,小红首先生成一个密钥对,保管好自己的私钥,并将公钥发布出去。小明可以直接向小红索要公钥,也可以从公钥服务器上获取公钥。得到公钥以后,使用公钥对消息进行加密,得到消息密文,将此密文发送给小红。小红收到密文以后,用自己的私钥对密文进行解密,就得到了明文。

我发现我身边的人很不清楚公钥和私钥的作用,所以在此特别说明一下。公钥和私钥统称密钥对,其中公钥用于加密,需要公布给别人知道,这样别人才能用公钥来加密消息。而私钥必须好好保管,不能让别人知道,私钥用于解密别人用公钥加密的消息。

另在,在需要对邮件进行签名的时候,使用私钥对消息进行签名,然后别人可以使用你的公钥来验证你的签名。

一般情况下,私钥都有一个保护密码,要使用私钥解密的时候必须输入这个密码,这是为了保证私钥的安全性。如果别人不知道私钥密码,即使他得到了私钥,也很难使用这个私钥来解密密文。

中间人攻击

天朝邮政中有一个邪恶的员工,他叫做小刚。小刚这个人心术不正,有偷窥欲望,喜欢偷窥别人的信件。在以前,小红和小明没有使用盒子把信件锁起来之前,小刚经常偷看小红和小明的信件,并且乐在其中。现在小刚郁闷了,他看不到小明和小红的信件了。小刚很不满,于是他研究了小明和小红之间的通信方式,发现其中有一个很大的漏洞。利用这个漏洞,小刚又可以偷窥小明和小红的信件了。

小刚是这样做到的。他注意到小明使用的锁头都是小红寄给小明的,而锁头在邮寄过程中是要通过天朝邮政的,小刚有机会接触到锁头。于是,小刚就想出了这样一个办法。小刚自己也制作了一批锁头和一把钥匙,在小红给小明邮寄锁头的时候,他把小红的锁头换成了自己的锁头,于是小明收到的就是小刚的锁头,而不是小红的锁头。现在,小刚有了一把小红的锁头,而小明收到的是小刚的锁头。不明真相的小明不知道他收到的锁头是小刚的,还是继续用这把锁头把盒子锁上,寄了出去。

小刚在邮政系统中很容易就截获了小明寄出去的这个盒子,而盒子上的锁头正是被小刚换掉的锁头。接着,小刚用自己的钥匙打开了盒子上锁着的自己的锁头,得到了盒子中的信件。小刚猥琐地偷窥完信件内容之后,用小红的锁头锁上这个盒子,让这个盒子继续它的旅途。别忘了,小刚手上会有小红的锁头,是因为他用自己的锁头换下了小红寄给小明的锁头。

小红收到信件以后,看到盒子上的锁头还是自己的锁头,用自己的钥匙打开了锁头,得到了盒子中的信件。可她完全不知道的是,信件早就被邪恶的小刚看过了。整个偷窥过程只有小刚一个人知道,小明不知道,小红也不知道,他们都以为信件在邮寄过程中没有被别人看过。这真是一个大杯具啊。

在非对称加密中,这就叫做中间人攻击。小红发布了自己的公钥,而小明在下载小红的公钥的过程中,却遭到了小刚的干扰,下载到的是小刚的公钥,而小明却不知道自己下载回来的是小刚的公钥,仍然认为是小红的公钥。不明真相的小明用这个公钥加密了消息,直接发送给了小红。

在发送过程中,小刚又截获了这段密文,因为这段密文是小明使用小刚的公钥加密得到的,小刚自然可以使用自己的私钥解密这段密文得到明文。小刚阅读完明文之后,使用小红的公钥加密这段明文,再放行这段消息给小红。小红收到消息后,使用自己的私钥解密,完全不知道明文已经被小刚看过了。

防止中间人攻击

有一天,小明和小红终于发现小刚的恶劣行径了,也发现了他们之间通信有如此巨大的漏洞。他们要想办法解决这个漏洞。为了模拟方便,在这里我们假设,小红他们制造锁头都是一批一批制造的,每批能制造出多个完全相同的锁头和一把钥匙。但是,因为受到生产环境的影响,不同批次生产出来的锁头都会有不同的形状,而且这个形状是没法控制的,可以认为是随机出现的形状。注意到这个细节,小明和小红发现可以根据锁头的形状来确定锁头是不是小红的锁头了。

首先,小红制造一批锁头,她得到了多个形状完全一样的锁头和一把钥匙。小红仔细观察了锁头的形状,然后打电话告诉把锁头的形状告诉了小明,小明也记下了锁头的形状。小刚只是天朝邮政的职工而已,他没办法控制电话线路,就算能控制电话线路,也很难假冒小红。这样,小明就能确定电话那头小红告诉他的锁头的形状确实是小红制造出来的锁头的形状。

接下来,小红还是按着原来的方法,把锁头寄给小明,小明用锁头把盒子锁上寄回给小红。因为小明已经知道了锁头的形状,小刚就没办法替换小红的锁头了。这是因为,不同批次生产出来的锁头,形状都是不一样的,小刚没办法制造出小红的锁头形状完全一样的锁头来,这样就没法替换小红的锁头了。如果小刚使用自己的锁头换下了小红的锁头,小刚在收到锁头的时候就会发现锁头的形状和小红在电话里描述的锁头形状不一样,于是知道他收到的锁头不是小红的锁头,也就不会用这把锁头来锁盒子了。小明可以要求小红再寄一把锁头给他,小明知道,只有收到形状完全和小红在电话里描述的形状完全一样的锁头,那才是小红的锁头,才可以用来锁盒子。

在非对称加密中,上面说的锁头的形状其实就是公钥的哈希值。小红生成自己的密钥对并发布公钥之后,还要将公钥的哈希值通过可信的方式告诉小明,小明下载回小红的公钥以后,首先要计算公钥的哈希值,如果哈希值和小红告诉他的哈希值相同,才能确定这就是小红的公钥。如果哈希值不同,那就有可能是遇到中间人攻击了。

在公钥服务器上,我们可以以自己的电子邮件地址来发布公钥,别人也可以通过这个电子邮件地址来查找公钥。假设小红在公钥服务器上以“hong@gsea.com.cn”发布了自己的公钥,公钥哈希值是0x12345678,并将这个值告诉小明。小明在公钥服务器上通过“hong@gsea.com.cn”来查找公钥,找到标记为“hong@gsea.com.cn”的公钥以后,要计算一下公钥的哈希值是不是0x12345678,如果是的话,就可以确定这个是小红的公钥。

好用的 PGP 软件以及吐槽

雷鸟(Thunderbird)插件 Enimail
火狐(Firefox)插件 FireGPG

其实我也就知道这两个软件而已,其中我用着 Enimail,包子用着 FireGPG,其他人……不知道。

我觉得防止中间人那段做的比喻很不好,但是我想不出更好的方法来模拟说明。我觉得我已经把非对称加密的过程说得很清楚了,如果还看不懂的话,不要试图怀疑我的语文水平,再去找其他文章看吧。最后,欢迎吐槽。

本文发表于 技术向,并添加了 , , 标记。保存永久链接到书签。

发表评论

电子邮件地址不会被公开。