GnuPG 与邮件加密
Table of Contents
本文主要根据 1 一文翻译并根据情况有所增删,目的是让朋友们能够对公私钥加密有一个初步的了解,并且希望通过阅读此文能够给我发送经过 GnuPG 加密后的邮件。同时,如果朋友们对 软件笔记 首页及 网络相关软件列表 中的部分内容感到迷惑的话,希望通过阅读此文能够有所解惑。
你可以到 这儿 下载本文的 PDF 版本。
GnuPG 简介
简而言之,加密就是 隐藏信息 。经过计算机科学家、数学家和政府秘密探员长时间的努力,这项技术目前已经非常易用并且无处不在了。加密技术的传播仍然不太普遍,但它对普通人而言却比以往更加重要了。
你发送和接收的每一封电子邮件、每一条即时消息,在你的计算机上往来时并没有进行保护。由于互联网的去中心化特性,所有的个人通讯都要经过数十台计算机,有时会通过几个国家进行传播,但从发送到接收之间可能仅隔几个微秒的时间。所有这些计算机,尤其是你的电子邮件提供者,会根据法律要求对你的信息保留较长的一段时间。个人在线交流并非你所想的那样隐私。
当面对在线交流的非隐私事实时,许多人会声称他们“没有什么需要隐藏”。根据George Washington 大学法律学院的 Solve 教授所言,“声称无须隐藏的是基于这样的假设,即隐私是为了隐藏坏的东西” ("The problem with the nothing to hide argument is with it's underlying assumption that privacy is about hiding bad things")。但你是否与私交有过极其个人问题的谈话呢?你是否会将这谈话录音并发送给地址簿中的每个人呢?如果没有,那么你就有一些需要隐藏的东西。并非隐藏的东西是 坏的 ,而是它*非常隐私* 而已。
并且……(根据本国法律,此段内容删除)。
就种种电子邮件隐私需求而言,有一个简单的解决方案,就是遵循 GNU 隐私指南 (GNU
Privacy Guard, 简写为 GPG, 或 GnuPG)。尽管 GPG 提供的加密办法非常安全,并且许多政府使用它来加密绝密信息,GPG 本身却并非容易使用。然而,一些软件及相关插件,却可以让用户很方便地使用 GPG,这也就是下面要介绍的 ThunderBird + Enigmail
和~Firefox
- FireGPG~ 的使用模式。
前提条件
GnuPG 非常安全,但再强的安全性也可能由于用户会犯的错误而被破坏,故不可以想当然地认为用户很清楚自己的行为。人们对邮件加密并非不常见,唯一的问题是他们的私钥被偷或者他们的密码太弱。并且,如果你的计算机已经被攻击者(可能是病毒或者其它类似的东西)破坏,那么他们偷走你的私钥和密码就太容易了,再接收你的私人通讯就更没问题了。(可参考 此文 学习如何安全地网上冲浪。另注:此处参考为英文。)
本文的目标读者为普通的计算用户。如果知道了如何浏览网页、发送电子邮件,你就可以参照此文。你不需要成为计算机高手,但你需要乐于思考。本文没有什么特别困难的东西,但你需要学会一些新的概念。如果你乐于新知,就读下去吧。
两种加密方式
对称加密
假设你要向一群朋友发送秘密信息,但你并不信任邮差。简单的办法就是寻找一种隐藏信息的方法。欲达此目的,你需要三样东西:发送的消息,与朋友们共享的秘密,一种相互认可的处理流程,从而使得共享的秘密能够隐藏在看起来不知所云的消息中。
这就是通常所说的对称加密,因为只有一个密钥,即只涉及一个秘密。将密钥与消息组合处理的过程称之为加密算法 (“算法”简单地说就是“一组指令”),有时也称为加密书写 (cypher). 由于这种加密很简单,用户不需要怎么考虑其中的数学细节。
非对称加密,即公钥加密
对称加密的一个简单问题就是:它不易于大规模处理。技术本身没什么问题,问题是使用该技术的人。众所周知,两个人保守一个秘密比一个人独自保守秘密难度加倍。三个人保守一个秘密,保密的难度是三倍,四个人则四倍……你可想见,一个小组的人如何能够安全地保守秘密呢?每增加一个人,保守秘密的难度也会增加。也就是说,当许多人共享一个对称加密的方法时,它很容易被泄密。
解决此问题的办法就是: 公钥加密法 。这种加密方式中,密钥的功能与在对称加密中所起的作用不大相同。假设你有一个秘密消息需要与一群朋友共享。但此时,这个加密方法所要求的是你的一群朋友每人都有两把密钥 (好比两把钥匙)。你不需要理解底层的数学细节,但你需要理解的是与使用一把密钥不同,
一对秘钥中只有一把能够加密,而另一把,也只有另一把密钥才能够解密 。
这种情况下,每个人都自己留一把密钥,而将另一把公开,让全世界都知道它。公开的那个称为 公钥, 另一个仔细隐藏并保护起来的称之为 私钥 。
它的工作过程是这样的:由于你公布了公钥,你的任何朋友都可以通过互联网找到这把公钥,并可以使用它把秘密消息加密后传给你。一旦使用你的公钥加密了消息,就只有你才能够对其解密,因为只有你拥有你自己的私钥。这就解决了需要让一群人共享一个秘密的难题。 (此过程可参照下图。)
digraph pubkey_encryp { msga [ shape=note, label="秘密消息"; ]; pubk [ shape=pentagon, style=filled, fontcolor=white, fillcolor=blue, label="A的公钥"; ]; msgs [ shape=folder, style=filled, fillcolor=yellow, label="加密后的密信"; ]; A [ style=filled, fillcolor=green, label="A"; ] prik [ shape=pentagon, style=filled, fillcolor=red, fontcolor=white, label="A的私钥"; ]; { prik->A; rank = same; } msgb [ shape=note, label="解密后的秘密"; ]; {msga; pubk;} -> B; B -> msgs [ label="加密" ]; msgs -> A; A -> msgb [ label="解密" ]; }
它还可让你做另一件事,就是证明自己的身份。如前所述,如果用一把密钥加密了,只有用另一把才能解密。因为你把自己的私钥保护得很隐秘(即只有你才会有),而你用私钥加密的消息只有你的公钥能够解密。假设所有人都认为你把自己的私钥保护得很安全,那么任何人能够解密你用私钥加密的消息,而你是唯一一个能够进行这种加密的人,从而你消息发送者的身份就得到了唯一认定。这也称为 签名 。通常情况是,消息发送者者使用私钥对消息进行加密或“签名”,再使用接收者的公钥进行加密。接收者首先使用自己的私钥,然后再使用发送者的公钥解密消息,则他们不仅知道只有谁能够读消息,也知道消息只有谁才能够发送。 (此过程可参照下图。)
digraph pubkey_sig { pubk_A [ label="A的公钥", shape=pentagon, style=filled, fontcolor=white, fillcolor=blue ]; prik_A [ label="A的私钥", shape=pentagon, style=filled, fillcolor=red, fontcolor=white ]; pubk_B [ label="B的公钥", shape=pentagon, style=filled, fontcolor=white, fillcolor=blue ]; prik_B [ label="B的私钥", shape=pentagon, style=filled, fillcolor=red, fontcolor=white ]; msg_a [ shape=note, label="消息" ]; msg_s1 [ shape=note, label="加密的密文1" ]; msg_sm [ shape=note, label="传输的密文" ]; msg_s2 [ shape=note, label="解密的密文2" ]; msg_b [ shape=note, label="解密的消息" ]; msg_a -> A; { prik_A -> A; rank=same; } A -> msg_s1 [ label="加密" ]; { pubk_B -> msg_s1; rank=same; } msg_s1 -> msg_sm [ label="加密" ]; msg_sm -> B; { prik_B -> B; rank=same; } B -> msg_s2 [ label="解密" ]; { pubk_A -> msg_s2; rank=same; } msg_s2 -> msg_b [ label="解密" ]; }
公钥密码学是 GPG 所使用的加密方法。上述所说的 密钥对 实际上是同一组的两个文件,包含有大量的数学相关的随机数。后面的内容将介绍如何安装软件、产生密钥对、发布公钥、进行消息加密等。在阅读后文之前,请确保你理解了上述的公钥加密的概念。
ThunderBird + Enigmail
注: 这部分内容为 1 中所没有。为方便,本文使用 PortableApps 打包的软件来阐述。相关内容可参考 Portable Apps 笔记 。
如果你不选择使用 PortableApps 提供的可移动版本的 ThunderBird,则软件的安装步骤如下:
- 从 http://www.mozillamessaging.com/thunderbird/ 下载 ThunderBird 并安装。
- 从 http://www.gpg4win.org/ 下载 Gpg4win 并安装。
- 从 ThunderBird 的“附加工具”中直接安装 Enigmail, 或者从 http://enigmail.mozdev.org/ 下载再安装
- 然后直接跳到 创建密钥对 一节。
其它的平台,如 Mac OS X, Linux 等,安装相应的软件即可,如在 Mac OS X 上可搜索安装 MacGPG2 等。
软件的安装
- 从 ThunderBird, Portable Edition 下载相应版本的 ThunderBird,比如从Download 按钮下方的 Languages 打开语言选择页面,从中选择简体中文版下载。目前最新版本为 3.0.3。
下载完毕后,双击下载的以
.paf.exe
结尾的文件,则启动安装界面。如下图。点击安装界面中的“下一步”按钮,则出现提示安装的目录。你可以选择任意目录进行。再“下一步”后则安装结束。
- 从 这儿下载 GPG for ThunderBird Portable 1.4.10 版本。
- 双击下载完毕的
.paf.exe
结尾的文件,同 Portable ThunderBird 的安装过程一样,所不同的是,在选择安装目录时,选择与刚才安装 *ThunderBird 相同的路径*。 - 打开 ThunderBird 的安装路径,在其中有一个名为
ThunderbirdPortable.exe
的可执行文件,双击即可运行移动版本的 ThunderBird 了。该目录下还应该有如下内容:- App – 程序的实际目录,其中应该包含有
AppInfo
,DefaultData
,gpg
, 和Thunderbird
这几个目录。 - Data – 用户的数据目录。
- Other – 其它内容,包括帮助及生成 paf 格式的源码等。
- App – 程序的实际目录,其中应该包含有
双击运行
ThunderbirdPortable.exe
, 会出现如下的窗口。您可以开始配置自己的邮件帐户了。 (或者点击“取消”,以后再配置。但建议你先配置好再进行下一步。)点击菜单“工具(T)–>附加组件(A)”,会出现如下窗口。从“获取附加组件”中搜索 Enigmail,选择“添加至 Thunderbird(A)…”,即可安装 ThunderBird 下的Enigmail 插件。如果无法联网,也可以在其它地方从http://enigmail.mozdev.org/ 下载相应版本的 Enigmail 插件,比如 Windows (32-bit) Thunderbird 3.0 对应的 Enigmail 1.0.1 版本,拷贝到移动介质中,比如U 盘。然后从“附加组件”对话框中选择“安装”按扭,从文件文件对话框中寻找你下载的
.xpi
文件,安装即可。安装之后重新启动 ThunderBird 即可。
创建密钥对
安装完毕后,重新启动 ThunderBird,会出现一个 OpenPGP 设置向导。按如下步骤进行:
- 选择“是的,我想用向导来帮我开始”,点击“下一步”。
- 在“数字签名”中,建议你选择“签署所有的电子邮件”。
- 在“加密”中,建议你选择默认值,即“给那些有公钥的邮件创建规则”。
- 在“选项”中,你可以调整一些细节。但默认的值挺好。
- 在创建密钥对时,如果选择“帐户/个人标识”不能正常选择你已经创建好的个人电子邮件帐户,你可以先选择“取消”。如果正常,输入你的密码后,则可成功创建一对密钥。
运行向导结束后,返回到你的 ThunderBird 界面。这时,选择菜单“安全(N)–>密钥管理器(Y)”打开密钥管理器对话框,如下图。
这时,选择 "Display All Keys" 如果没有显示内容,表明向导中创建密钥对失败。没关系,选择密钥管理器的菜单“创建(G)–>新密钥对(K)”,可打开如下对话框。
填写相应的信息,比如“密码”、有效期等。其中“高级”中的“密钥长度”默认选择 2048 位即可,密钥类型默认为 "RSA" 即可。然后点击“生成密钥”,等待一会,会提示你“创建关保存撤销证书”,保存即可。
注: 当你的私钥丢失时,你可以使用“撤销证书”来声明你的公钥无效。
此时,你的密钥管理器中会出现你刚才生成的密钥。右键点击此密钥,选择“导出密钥到文件”,然后保存你的公钥为一个文本文件,比如我的公钥文件 ExaosLee\_pub.asc 。
到此为止,你的个人密钥对已经设置完毕。
分发公钥
Enigmail 的密钥管理器可以导出公钥、私钥等,你可以将自己的私钥导出保存在安全的地方。如前面第一节中所述,你的公钥需要分发给朋友们,这样大家才可以给你写加密的邮件。
分发公钥有几种方式:
- 将你的公钥导出到文件文件中,上传到互联网的某个位置。然后告诉大家地址。
- 使用密钥服务器。
有许多公共的公钥服务器,在安装的 Enigmail 中就默认提供了一些,比如:
- pool.sks-keyservers.net
- subkeys.pgp.net
- pgp.mit.edu
- ldap://certserver.pgp.com
你可以直接通过右键点击密钥,选择“上传公钥到密钥服务器”即可。然后大家就可以在你上传到的密钥服务器上搜索到你的公钥。另外,你也可以使用浏览器打开 http://keyserver.pgp.com/ 等网站,通过网页把你的公钥上传到服务器上。
导入密钥
通过密钥管理器,你可以导出密钥对,也可以导入朋友们的公钥。比如,你可以从 这儿直接下载,或者从 PGP Global Directory 搜索我的电子邮件地址,然后下载搜索到的公钥并保存为文件 ExaosLee\_pub.asc
. 然后打开 ThunderBird 中密钥管理器,通过菜单“文件(F)–>从文件导入密钥(I)”导入下载的公钥文件。
我的公钥导入后,如下图中的粉红线部分所示,如果双击“用户属性 (JPEG 图像)”则可以看到公钥中所包含的我的照片。
创建加密邮件
从 ThunderBird 的工具条中选择“新建消息”,可打开邮件编写窗口。如下图所示,在编写完邮件后,从工具条或菜单中选择“加密邮件 (E)”,则在发送邮件时会自动使用该邮件接收人所拥有的公钥对信件内容进行加密。
下图为所发送的加密信件未解密时的内容。从图中可见,如果未解密,根本无从知道所书写的内容。
Firefox + FireGPG
如果你不需要使用 PortableApps 提供的可移动版本的 FireFox, 在 Windows 下软件安装步骤如下:
- 从 http://www.mozilla.com/firefox/ 下载 FireFox 并安装。
- 从 http://www.gpg4win.org/ 下载 Gpg4win 并安装。
- 从 http://getfiregpg.org/ 下载 FireGPG 或者直接从 FireFox 的“附加组件”中安装 FireGPG。
- 跳过软件安装,直接到后面的 FireGPG 使用介绍。
后文参照了 2 中的部分内容。
其它的平台,如 Mac OS X, Linux 等,安装相应的软件即可,如在 Mac OS X 上可搜索安装 MacGPG2 等。
软件安装
如下的安装过程类似于 ThunderBird + Enigmail。
- 从 http://portableapps.com/apps/internet/firefox_portable 选择相应的语言,并下载安装包。
- 打开下载的
.paf.exe
文件,选择安装路径,然后点“下一步”即可。在这儿假设你的FirefoxPortable
和ThunderbirdPortable
目录都在同一个目录下。 - 从
FirefoxPortable
目录中双击FirefoxPortable.exe
文件运行。从 FireFox 的菜单“工具–>附加组件”打开“附加组件对话框,从“获取附加组件”中搜索 FireGPG 并安装,或者直接从 http://getfiregpg.org/ 下载,然后从菜单“文件–> 打开文件”选择下载的.xpi
文件进行安装。 (注:GetFirGPG.org 似乎被墙!) - FireGPG 的设置:
如下图所示,从 FireFox 的菜单“工具–>FireGPG–>选项”打开 FireGPG 的设置对话框。
如果是非移动版本的 FireFox,可使用 FireGPG 自动检测到的 GPG 路径设置。如果使用移动版本的 FireFox,假设
FirefoxPortable
目录与前一节所述的 Portable ThunderBird 安装在同一目录下,可按下图中粉红色圈中所示的路径进行参数设置。 (这儿参考了 3)。其中
gpg
命令行参数为:--home {$FXFolder}\..\..\..\ThunderbirdPortable\Data\gpg
而 GPG 的路径则设置为“手动指定”,指定的值为:
{$FXFolder}\..\..\..\ThunderbirdPortable\App\gpg\gpg.exe
创建密钥对
从 FireFox 的菜单“工具–>FireGPG–>密钥管理器”打开密钥管理器,从如下图粉红圈所示的位置选择“新建密钥”。
在打开如下图所示的对话框中填写相应的信息,并点击“产生密钥”,等待密钥生成结束。
最后,经过设置,生成的密钥信息如下图所示:
密钥的备份
同上一节中创建密钥对相似,先从密钥列表中选择一组密钥,然后从密钥管理器下面一排的按扭中选择“导出到文件”,则可对密钥进行备份。
公钥的分发
同上一节,选择密钥管理器中的“导出到服务器”,即可进行密钥分发。也可如 ThunderBird 一节中所述,将导出的公钥文件上传到诸如 http://keyserver.pgp.com/等网 站上。
签名并验证文本
有时,你需要发布一些文档,并且让所有人都知道此文档是由你所写。那么,你可以使用“签名”功能。方法如下:
- 从 FireFox 菜单“工具–>FireGPG–>文本编辑器”打开文本编辑器。
在文本编辑器中编写任意内容,然后点击下方的“签名”按钮,如下图所示,选择你的私钥进行签名。
输入你的私钥密码,以便进行签名,如下图。
签名后的信息如下图所示:
你可以将这签名后的内容拷贝到电子邮件中,发送给你的朋友。拥有你公钥的人则可以利用你的公钥将其解密,从而知道这就是你发出的内容。
用公钥加密
用公钥加密的过程与签名的过程类似,所不同的是点击不同的按钮,选择不同的密钥而已。
解密验证文本
FireGPG 会自动探测网页中的签名文本块。它会默认隐藏签名数据并显示难后的文本。点击“验证”可以检查签名能否用你收集的公钥进行验证。当然,如果你想查看全部的检验信息,可点击“显示原始内容”。
注: 通常签名可以针对全部的内容,或者针对全部内容的哈希检验码 (如 MD5, SHA1等) 进行,由签名者决定。
其它
FireGPG 会在你打开 Gmail 信箱时自动对打开的信件提供相应的插入操作,如内嵌式签名、验证、解密、加密等。但遗憾的是在写本文时,由于 getfiregpg.org 网站一直打不开,无法进行截图操作。只希望 FireGPG 网站能够正常访问吧。
GNU Privacy Assistant (GPA)
The GNU Privacy Assistant 是 GnuPG (GNU Privacy Guard) 的图形用户界面。它使用GTK (The GIMP ToolKit) 作为图形后端,有多种平台的二进制可执行程序。其截图如下所示:
- URL – http://wald.intevation.org/projects/gpa/
- 版本: 2009-06-20, 0.9.0
在 Debian 下可以通过 apt-get install gpa
直接安装该软件包。但你可能更喜欢
Gnome 中自带的 seahorse, 或者 KDE 中的 kgpg 等。