一、基本概念

OpenPGP 协议与 PGP 、GPG 之间的关系

要了解 OpenPGP 协议加密工具如何使用,就需要先了解 OpenPGP 协议,而要了解 OpenPGP 协议,就需要了解什么是 PGP 。

PGP,全称 Pretty Good Privacy,是一款由 Phil Zimmermann 在1991年开发的加密程序,为数据通信提供了加密和验证功能,通常用于签名、加密和解密文本、电子邮件和文件。

PGP 被开发出来后不久便迅速被开发者上传至网络,引起了全世界范围内黑客的关注。但好景不长,1993年2月美国联邦政府以“未经许可出口军需品”为由调查 Phil Zimmermann(当时的美国出口法中将使用大于40位密钥的密码系统视为军需品),试图阻止 PGP 加密工具的在全世界范围内的传播。但 开发者Phil Zimmermann 以极具想象力的方法利用了美国版权法律的漏洞,将全部的源码印刷成书籍通过 MIT 出版社发行并运输到西欧,不久后西欧的黑客使用 OCR 技术将 PGP 的源代码重新编译(并最终通过分析其原理,写出了如今的自由的加密软件 GPG)。

到了1996年,由于 PGP 软件源代码已得到广泛传播,加上各界舆论压力,美国联邦政府初撤销了对 Zimmermann 和他的团队的诉讼。于是 Zimmermann 新成立一家名为 PGP Inc. 的公司开发新版本的 PGP。1997年7月,PGP Inc. 向 IETF 提议制定一项名为 OpenPGP 的统一的标准,IETF接受了该提议,并成立了 OpenPGP 工作组。而后 PGP 软件的版权则兜兜转转,最终于2010年被 Symantec Corp.(赛门铁克)以3亿美元收购。

简单概括:

PGP 是一款由 Phil Zimmermann 开发,最终被赛门铁克收购的私有软件。 OpenPGP 是基于 PGP 软件所衍生出的一种加密协议,定义了加密消息、签名、私钥和用于交换公钥的证书统一标准。 GPG(GnuPG)是符合 OpenPGP 标准的用于加密的自由软件,是 OpenPGP 的自由实现。

OpenPGP与对称/非对称加密

OpenPGP 协议支持对称加密和非对称加密。

在对称加密中,加密和解密使用同一个密钥,这样做加密解密速度快,但密钥也很容易泄漏。

非对称加密中,加密和解密使用不同的密钥,在 OpenPGP 协议下,用户使用两把具有对应关系的密钥组成的密钥对完成加解密操作(对应关系体现为通过某一把公钥生成的密文,需要用它对应的私钥才能解密,以及通过公钥无法推导得出私钥),其中用于加密的作为可以广泛传播的公钥,用于解密的作为仅用户自身持有的私钥。

由于对称加密算法比非对称加密算法的加密速度快很多,在实际应用中,我们通常使用对称加密算法加密数据,再用非对称加密算法加密前者的对称密钥(称会话密钥),这样做即拥有了对称加密的加密速度,又保障了会话密钥的安全性,在OpenPGP中亦是如此。

OpenPGP的数字签名

数字签名也是 OpenPGP 的重要功能,它与传统的字迹签名功能相似,即用来验证人员身份,避免他人冒充。但数字签名相对比起字迹签名,更严谨、更安全且极难仿冒。

OpenPGP 协议的数字签名用某位用户(以下简称为用户a)的私钥签名,公钥验证。其背后的原理是:用户a的私钥仅由其本人持有,那么持有该私钥的人就是用户a本人(此处不考虑用户a的私钥被第三方窃取的情况,这种情况属于社会工程学研究的范围,而非密码学),因此用该私钥产生的数字签名能用来证明用户a的真实身份。而用户a的私钥有对应的不可篡改的公钥,利用公钥即可验证数字签名的真伪型。

OpenPGP 的公钥发布与吊销证书

公钥用于加密,可以公开发布,用户既可以点对点只向部分其他用户传播公钥,也可以上传公钥到密钥服务器。用户可以为公钥设置 uid ,一般为电子邮件地址和其他名称。设置 uid 能方便其他用户的加密和检索公钥操作。

为了进一步保护用户的数据安全,OpenPGP 协议中的公钥往往默认包含有效期限,用户通过 OpenPGP 协议加密工具使用过期公钥加密信息时将会收到警告提示。用户可以事先生成用私钥签署的吊销证书,这样一旦私钥泄漏,用户即可将吊销证书发布出去以将对应的公钥吊销。对于长期不使用的密钥对,用户亦可即时使用私钥生成吊销证书吊销。

需要格外注意的是,如果你将公钥发布到密钥服务器,那么你将永远无法从密钥服务器上删除你的公钥信息,特别是公钥的 uid 中包含邮箱地址信息的情况,将会对个人信息安全造成威胁。尽管用户可以使用私钥生成吊销证书吊销服务器上的公钥,使公钥其显示“吊销”字样,但公钥所附带的标识信息却仍将保留在密钥服务器上。请务必谨慎上传公钥。

二、OpenPGP 协议的具体的自由软件实现

GPG 与其图形化前端 GPA

在 GNU/Linux 等 PC 操作系统中主流的 OpenPGP 协议的自由软件实现是命令行软件 GPG ,其基本操作可参考其官方中文指南

GPA 是 GPG 的图形化前端,通过图形化的界面让 GPG 的功能实现更为直观更容易学习。

注意:GPA 只是通过调用 GPG 来行使功能的图形化前端,如果系统中不存在 GPG, GPA 就无法单独发挥作用。

下面将介绍如何使用 GPA 完成最基本的操作。

1.生成密钥对

初次使用 GPA 需要首先生成密钥对。用户可选择顶边栏的“密钥(K)”,选择其中的“建立新密钥…(N)”。接着软件会提示您输入“您的名字”;输入后提示输入“您的电邮地址”;完成后提示“建立备份(b)”和“往后才进行(l)”,此处可根据个人实际情况决定。接着会提示输入密钥对保护口令,输入口令后电脑将自动计算生成密钥对。

注意:生成密钥对时提示的“您的名字”“您的电邮地址”仅仅作为密钥对的 uid 用,不必使用个人真实姓名/电子邮件地址。

提示:使用 gpg 可输入gpg --generate-key而后根据软件提示完成密钥对生成。

2.导出/导入公钥

导出公钥前,首先在“密钥管理器”里选中对应的密钥对/公钥,而后选择顶边栏的“密钥(K)”,选择其中的“导出密钥…(x)”,后根据软件提示将公钥文本保存到某个目录下,以便发送给其他人。也可选择“编辑(E)”-“复制©”,以拷贝的方式导出。

提示:使用 gpg 可输入gpg -a --export <需导出的公钥的 uid 或指纹的一部分> 直接在终端中以 ascii 的形式导出所需公钥。也可输入 gpg -a --export <需导出的公钥的 uid 或指纹的一部分> -o <名称随意>.asc把以 ascii 的形式编写的公钥文本导出到文本文件中。不加-a选项也可以二进制的形式导出公钥到文件。

导入公钥则需要首先取得对方的公钥,而后既可以直接选择“密钥(K)”-“导入密钥(I)”-所需的公钥直接导入。也可以打开所需的公钥文本,将公钥文本本身复制下来,选择“编辑(E)”-“粘贴(P)”导入。

提示:使用 gpg 可输入 gpg --import而后将公钥文本直接粘帖进来,连按两次 ctrl + D 导入。也可输入gpg --import <所需文件名>.asc指定所需导入的文件。

3.加密/解密

使用 GPA 加密信息可选择“窗口(W)”-“剪切板©”,而后在“剪切板”窗口里里输入所需加密的明文,接着在“剪切板”页面中选择“文件(F)”-“加密(E)”,选择所需的公钥,点“确定(O)”。

如果要加密的信息是文件,则可在 GPA 主界面里选择“窗口(W)”-“文件管理器(F)”,而后在“文件管理器”窗口里选择“文件(F)”-“打开(O)”,而后选择所需文件。选好所需文件后,选择“文件(F)”-“加密(E)”,选择所需公钥,点“确定(O)”。

提示:使用 gpg 可输入gpg -ae而后根据提示输入所需加密的公钥的 uid 以空白行结尾。然后将所需加密的明文粘贴进来,连按 ctrl + D ,直接在终端中以 ascii 的形式生成所需密文。也可加上 -o <导出文件名>.asc,将密文导出到文件中。也可指定文件,如果 gpg -ae <指定文件名> -o <被加密文件名>生成加密文件。

解密过程与加密过程类似。

可选择“窗口(W)”-“剪切板©”,而后在“剪切板”窗口里里输入所需解密的密文,接着在“剪切板”页面中选择“文件(F)”-“解密(D)”,输入私钥保护口令完成解密。

如果收到的是密件,可“窗口(W)”-“文件管理器(F)”,而后在“文件管理器”窗口里选择“文件(F)”-“打开(O)”,而后选择所需解密的密件。而后,选择“文件(F)”-“解密(D)”,输入私钥保护口令完成解密。

提示:使用 gpg 可输入gpg -d而后直接将密文粘贴进来,连按 ctrl + D ,输入私钥保护口令,直接在终端中输出明文。一次性可以粘贴进多份密文。也可输入gpg -d <指定文本密件名>将文本形成的密件中的密文解密后输出到终端。注意:二进制形式的文件(如 pdf 格式的文件)直接输出到终端里将是乱码,须加上-o <指定的文件名>,或利用重定向,将输出数据保存到文件。

4.签名/验证

使用 GPA 进行数字签名可选择“窗口(W)”-“剪切板©”,而后在“剪切板”窗口里里输入所需签名的文本,接着在“剪切板”页面中选择“文件(F)”-“签名(S)”,选择所需的私钥,点“确定(O)”。如果要为某份将要生成的密文签名,可在加密的同时进行签名,即输入文本后选择“文件(F)”-“加密(E)”,选择所需加密的公钥的同时,选中“签名(S)”,选择所需签名的私钥,点“确定(O)”。

如果为某份文件签名,可选择“窗口(W)”-“文件管理器(F)”,而后在“文件管理器”窗口里选择“文件(F)”-“打开(O)”,而后选择所需文件选好所需文件后,选择“文件(F)”-“签名(S)”,选择所需私钥,点“确定(O)”。

提示:使用 gpg 可输入gpg -as -u <所需私钥的uid或指纹>,输入需要签名的文本,连按 ctrl + D,将签名文本直接输出到终端里,也可加上-o <指定的文件名>将签名文本导出到文件中。也可以输入gpg -ase -u <用户的所需私钥的uid或指纹> -r <所需的对方的公钥的 uid 或指纹>,输入所需要加密、签名的文本,将附带了签名的密文输出到终端里,也可加上-o <指定的文件名>将签名文本导出到文件中。也可以输入gpg -s -u <用户的所需私钥的uid或指纹> <需要签名的文件名> -o <被签名后的文件名>,为一份文件签名。为一份文件加密、签名的操作不再赘述。

验证的过程与签名的过程类似。

使用 GPA 验证数字签名可选择“窗口(W)”-“剪切板©”,而后在“剪切板”窗口里里输入所需验签的文本,接着在“剪切板”页面中选择“文件(F)”-“验证(V)”,而后即可验证名。对于附带了签名的密文,也应该选择“文件(F)”-“验证(V)”,验证签名的同时解密密文。这一点是 GPA 的设计缺陷。

提示:使用 gpg 可在输入gpg -d后的解密的过程中验证签名,推荐解密时优先使用 gpg 工具。

通过 GPA 验证文件的签名,可选择“窗口(W)”-“文件管理器(F)”,而后在“文件管理器”窗口里选择“文件(F)”-“打开(O)”,而后选择所需文件选好所需文件后,选择“文件(F)”-“验证(V)”,即可验证。验证并解密密件的过程不再赘述。

5.进阶操作:导出/导入私钥

一般情况下,不建议您随意导出私钥,将私钥分布在不同的设备上,因为这样会增加您私钥泄漏的风险。但如果您确实有导出私钥的需要,您可以按照以下布置进行:

在 GPA 的主界面的“密钥管理器”里选择找到需要导出的密钥对,右键选择“备份(B)…”,而后选择要导出到的目录。

提示:使用 gpg 可输入gpg -a --export-secretkey,输入所需导出的私钥的口令,无需导出的私钥直接点击“取消”跳过即可。

导入私钥的方法与导入公钥的方法类似,不再赘述。

提示:如果非要进行跨设备导入/导出私钥的操作,建议对私钥文本/文件本身进行对称加密操作,在需要导入的设备上使用 OpenPGP 协议的软件在解密包含私钥的密文/密件的同时,即导入私钥,不应该让私钥以明文的形式保存在本地。

OpenKeychain

OpenKeychain 是一款安卓设备上的使用的 Openpgp 协议的加密软件,使用安卓设备时可以使用 OpenKeychain 来加解/密 OpenPGP 协议的密文。

1.生成密钥对

第一次使用时可在界面上选择“创建密钥”,输入用作 uid 的“全名或昵称”以及“电子邮件”,而后选择“创建密钥”,如无特殊要求,不建议上传公钥至密钥服务器。

提示:如果创建好密钥对后还想再创建其他密钥对,可以在 OpenKeychain 中点击右上角,选择“管理我的密钥”,再次选择“创建密钥”执行如上步骤。

2.导出/导入公钥

在 OpenKeychain 主界面中,选择需要导出的公钥,在需要导出公钥的密钥界面里,可以点击二维码图标,让其他用户通过扫描二维码取得您的公钥。您也可以在此界面上点击右上角,选择“更多密钥详情”,点击“分享”,在“分享密钥”的“分享到…”一栏里点击左侧图标直接通过其他软件分享,或者点击右侧图标复制公钥。

导入可点击 OpenKeychain 主界面的右下角的“+”,根据实际情况,选择“扫描二维码”,从“文件导入”,还是“搜索密钥”。

提示:在“从文件导入”的界面里,可点击右上角,选择“从剪贴板读取”,将复制的密钥文本导入其中。

3. 加密/解密、签名/验证

在 OpenKeychain 主界面,点击左上角,选择“加密/解密”,在此界面内,可根据实际情况选择“加密文件”“加密文本”,在“加密文件”“加密文本”的界面中可选择“签名密钥:”对将要加密的“文件”“文本”进行签名。

提示:OpenKeychain 不支持对明文签名。

在相同界面上,可选择“解密/验证”下的“从文件导入”或从“剪贴板导入”导入需要解密的密件或密文。

4.导出私钥

在 OpenKeychain 主界面中,选择需要导出私钥的密钥对,在需要导出私钥的密钥对界面里,点击右上角,选择“备份密钥”,而后软件将自动为私钥加密备份,用户需将软件自动生成的“备份密码”保存好,以便导入时用。而后用户需将“我已抄写了备份密码。如果没有密钥,我就不能从备份中恢复数据”选中。而后选择“分享备份”或者“保存备份”。

提示:从 OpenKeychain 将私钥导出后,可以将包含私钥的密件上传到电脑输入gpg -d <密件名>|gpg --import,而后输入备份密码,将私钥导入 gpg 。

在 OpenKeychain 中导入私钥到 OpenKeychain 的操作与导入公钥的操作类似,如果从包含了私钥的密件中导入私钥,也可以在“加密/解密”中选择“从文件导入”,在输入了口令后软件将提示导入私钥。