使用 GnuPG 实现电子邮件加密和数字签名

Posted by Azrael on April 13, 2017

一、加密和数字签名的简单原理

首先每位用户都需要用 GnuPG 程序生成地球上惟一的一对钥匙,分别称为公钥和私钥(即 public key 和 private/secret key)。

公钥用于加密、私钥用于解密。使用公钥加密过的信息只能由配对的私钥解开。这种加密方式叫做非对称加密

非对称加密的过程是:

如果A君要发送信息给B君,首先B君得把自己的公钥扔出来,A君得获取B君的公钥后,用B君的公钥加密信息并发送过去,B君收到(加过密的)信息使用自己的私钥解密就可以还原信息了。

在数字签名时,私钥用于签名、公钥用于核对签名。

数字签名的过程是:如果A君要发送信息给B君,信息首先会被计算出一个指纹值(比如MD5值),然后A君使用自己的私钥加密信息和这个指纹值(这个过程称为签名)并发送出去。

接受者B君收到信息之后使用A君的公钥来解密并重新核对一次信息的指纹值,这样B君就可以核对信息有无被篡改以及是否真的为A君所发出的了。

二、下载并安装 GnuPG

GnuPG 是一个集钥匙管理、加密解密、数字签名于一身的工具。

对于 Linux 系统,一般可以在系统本身的软件源找到 GnuPG。

比如对于 ArchLinux 可以使用如下命令安装:

$ sudo pacman -S gnupg

Debian / Ubuntu 环境下安装(一般默认已安装):

sudo apt-get install gnupg

Fedora 环境下安装:

yum install gnupg

也可以 下载源码,自己编译安装。

./configure
make
make install

安装完成后,键入下面的命令:

gpg --help

如果屏幕显示GPG的帮助,就表示安装成功。

对于 Windows 系统可以下载免费开源程序包 GPG4Win

建议下载完全版,里面既包含了 GnuPG 命令行工具,又有图形化的钥匙管理工具 Kleopatra 和邮件客户端程序 Claws Mail。

对于Mac OSX 系统则可以使用 GPGTools

更多的相关工具可以在 这里 找到。

三、使用(图形化)工具管理钥匙

上一节提到,在不同的平台下所使用的管理工具各不相同,幸运的是他们的功能大同小异,而且界面简单,相信只要你一运行则不用看教程都会使用。下面就提一下使用要点:

以 Linux Gnome 桌面环境自带的钥匙管理工具 seahorse 为例:

1、生成钥匙对。

一般点击“文件”菜单就会找到“新建PGP钥匙”的选项,跟着提示输入你的名字(建议使用你常用的网名)、email地址以及备注(可以不填)就会生成一个属于你自己的钥匙对。

期间会提示你输入一个密码,这个密码是用于保护你的私钥,建议使用比较复杂的密码。

2、发布你的公钥。

因为你的朋友要发送加密信息给你则必须要先获取你的公钥,所以,作为一个有礼貌的 GnuPG 用户应该先发为敬。

Internet上有很多免费的公钥服务器,你可以把你的公钥发布到随便一个服务器,它们之间会自动同步(最长可能需要几小时或者几天)。在管理工具里选定你的钥匙对,然后选择类似“发布”或者“远程-同步”之类的选项即可。

在发布的时候工具可能会询问你使用哪个公钥服务器,正如刚才所说的,随便选一个就可以了。

3、获取你朋友的公钥(或者让朋友获取你的公钥)。

在管理工具里选择类似“搜索”或者“远程-查找钥匙”,在搜索框里填写对方的email地址或者生成钥匙时所填写的名字,然后点击搜索就可以找到对方的公钥。

作为练习,你可以搜索自己的公钥,如果搜索没有结果则可能时因为服务器还没同步,可以过几分钟再试试。点击选中搜索结果,然后再选“导入”即完成。

4、签收(sign)公钥。

为了安全起见,获取你朋友的公钥之后,还需要跟对方核对一下这个公钥是否真的为他所拥有(因为可能存在假冒的情况)。核对的方法是选中你朋友的公钥,再选择类似“属性”或者“详细信息”的选项,其中你可以看到这个钥匙的指纹值,你可以通过电话、聊天工具或者email跟你的朋友核对一下,如果指纹值相同,则点击“签收这个钥匙(sign this key)”,这样就表示你正式可用这个公钥了。

(补充:为了避免跟“数字签名”这个名词相冲突,这里我把“sign”书写为“签收”,在一些教程里可能会翻译为“签名钥匙”)

四、邮件加密和数字签名

实现邮件加密和数字签名一般需要使用邮件客户端软件,现在一般比较完善的邮件客户端工具都内置集成 OpenPGP 的功能,即本身就可以无缝地使用 GnuPG。

比如 Evolution、KMail、Mozilla Thunderbird,对于 Linux、Windows 和 Mac OSX 系统,我比较推荐 Thunderbird,这也是一个开源免费程序。

谷歌告诉我 Windows 下的 Outlook 和 Live Mail 也支持但我没有试验过,如果不行又懒得下载 Thunderbird,那么使用 GPG4Win 附带的 Claws Mail 也是可以的。

因为各个邮件客户端的设置大同小异,下面我以 Evolution 为例简单介绍如何设置。

其实关键的设置只有一步,就是关联你的 email 帐号和你的钥匙id。

在 Evolution 的帐号属性里,转到 Security 页,在 OpenPGP Key Id 里输入你的钥匙的id(即生成钥匙对时所填写的名字)或者email地址即可。

设置就这么简单。然后在每次写 email 时点击菜单的 Options 勾选 OpenPGP 签名或者/以及加密,然后再发送即可。

对方收到邮件时,Evolution 会自动检验签名或者自动解密邮件内容。需要注意的是,在发送加密邮件给你的朋友之前,你要先获取他的公钥。

提示1:

在签名或者解密时,有可能会弹出一个窗口要求你输入一个密码,这个密码就是生成钥匙对时设置的密码。

提示2:

用网易邮箱收取签过名(而未加密)的邮件时可能会显示检验失败,这是因为网易邮箱会在邮件末尾添加附件的下载地址,相当于更改了邮件的原始内容,所以签名检验失败是肯定的。

好了,如果你只需要电子邮件加密和数字签名,这篇教程到此为止了。