如何创建一个 PGP 密钥对

PGP是什么

PGP 英文为 Pretty Good Privacy

是由一名叫做 Philip R. Zimmermann, Jr. 的人于1991年公开发布的一个免费的加密软件

它可以作用于加密,解密,签名和验证

后来被 NortonLifeLock (前 Symantec 赛门铁克) 公司收购

由于PGP是商业软件,因此后来1997年的时候,原作者 Philip R. Zimmermann, Jr. 同意开放一个新的互联网标准叫做 OpenPGP

于是很多同类产品就出现了,其中包括了今天我们等会要介绍的 GPG

GPG是什么

GPG全称是 GNU Privacy Guard

是 GNU 革奴计划 中的一部分,遵循OpenPGP标准,兼容PGP;目前预装在了大量的Linux发行版中

今天我们进行演示的设备有 macOS, Windows, Ubuntu Linux, Android 和 iOS

加密和签名流程

通过了解 PGP (包括OpenPGP标准) 的加密和签名流程,可以帮助可能一脸懵逼的你更快的了解如何使用这类产品

初次使用这类产品,我们需要建立一个 密钥对 ,密钥对会分为: 公钥私钥

公钥用于加密和验证签名可以进行公开 ;私钥则进行解密和签名需要自行保管

我们会通过三个例子来说明加密流程

仅签名,无加密

一个公司要向外部公布一些讯息/文件,不过为了可以验证该讯息/文件确实是来自公司而不是其他人,公司可以通过私钥签名出一个讯息/文件

当你想去验证这个讯息/文件是否真的来自这个公司的时候,只需要将这个公司提供的公钥加入自己的密钥库中,然后开始验证

验证成功则代表这个讯息/文件的确来自该公司,如果出现错误,则表明讯息/文件不来自这个公司

仅加密,无签名

友人A要给友人B传输一个加密的讯息/文件

友人A会通过友人B的公钥加密出一个PGP讯息/文件

公钥加密过后的信息, 只有私钥持有人才可以解锁

也就是说,友人A使用友人B公钥加密过后的讯息/文件,只有友人B才可以解锁

当然,友人A也可以选择多个人的公钥来进行加密,这样,被选择的人也可以解锁

加密,并且签名

董事成员A要给董事会发送一个讯息/文件,现在,这个讯息/文件不但要经过加密,还想确保这个讯息/文件就是来自董事成员A,而不是来自其他人

因此,在加密的时候除了要选择使用董事会的公钥进行加密,还需要另外启用签名选项

签名这个操作是使用董事成员A自己的私钥进行签名,接下来,加密出来的讯息/文件就会带有董事成员A的签名信息

因为董事会已经预先存储好了董事成员A的公钥 ,因此,在董事会解密讯息/文件的时候,会看到这个讯息/文件带有董事成员A的数字签名的相关信息

如果在解密的时候没有看到类似的信息,或者提示未知签名者或者签名无效,说明董事会并未存储董事成员A的公钥,又或者,这不是董事成员A发来的讯息/文件

开始建立密钥

密钥建立 (macOS - GPG Tools)

在 macOS 下常用的 GPG 工具集叫做 GPG Tools,包含了 GPG 的本体和一些周围软件,例如图形化的密钥管理工具,给 macOS Mail App 使用的加密和签名插件等等

请前往 GPG Tools 官网 下载安装档案

下载完毕之后打开 GPG Keychain

然后点击左上角 New 按钮

填写一些信息,例如名字,邮件地址和私钥密码

接下来点击 Generate Key

之后软件可能会询问你是否将你的公钥上传到公钥服务器,对于新手或者不知道这个是什么的人可以暂时选择否定答案

然后你会在 GPG Keychain 软件中看到你刚才新建的密钥对

密钥导出 (macOS - GPG Tools)

对着你刚新建的密钥右键选择 Export… 可以将你的公钥导出,私钥导出同样选择 Export…,但是请勾选上 Include secret key in exported file;这样就可以导出私钥

密钥建立 (Windows - Gpg4win)

Windows下使用的工具为 Gpg4win

安装完成后打开 Kleopatra

点击 文件 下的 新建密钥对

选择 创建个人OpenPGP密钥对

输入 姓名电子邮件

下一步开始建立密钥对,在建立的时候会有弹窗让你设定 私钥密码

创建成功

密钥导出 (Windows - Gpg4win)

Kleopatra 中右键密钥,选择导出可以导出公钥,选择导出绝密密钥可以导出私钥

密钥建立 (Ubuntu - GPG)

事实上,命令行的操作适用于任何成功安装了 GPG 的操作系统

Ubuntu中默认带有GPG,因此建立密钥可以使用以下命令开始

1
gpg --gen-key

请根据提示依次输入: 姓名和电子邮件地址

然后弹出以下信息:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
gpg (GnuPG) 2.2.4; Copyright (C) 2017 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Note: Use "gpg --full-generate-key" for a full featured key generation dialog.

You need a user ID to identify your key; the software constructs the user ID
from the Real Name, Comment and Email Address in this form:
"Heinrich Heine (Der Dichter) <[email protected]>"

真实姓名: Huijie Chen
电子邮件地址: [Email Addr]
您选定了这个用户标识:
“Huijie Chen <Email Addr>”

Change (N)ame, (E)mail, or (O)kay/(Q)uit?

输入 N 更改名字,输入 E 更改邮件地址,输入 O 进入下一步,输入 Q 则退出

接下来我们输入 O 进入下一步

下一步需要设定私钥密码,用户自行设定

设定密码之后会有这种提示

  • 我们需要生成大量的随机字节。这个时候您可以多做些琐事(像是敲打键盘、移动
    鼠标、读写硬盘之类的),这会让随机数字发生器有更好的机会获得足够的熵数。

好的,我们开始瞎敲键盘吧,整个过程会持续大概十几秒左右

接下来密钥就成功建立了

密钥导出 (Ubuntu - GPG)

接下来通过以下命令分别导出 公钥私钥

1
gpg --output publickey --armor --export 邮箱/用户ID
1
gpg --output seckey --armor --export-secret-key 邮箱/用户ID

导出私钥时需要输入密码,如果是在CLI界面下进行操作,需要在前面加上sudo以在CLI界面下可以输入密码,否则将无法导出

密钥建立 (iOS - Tessercube)

在iOS下使用的工具为 Tessercube

下载后点击

点击 右上角 加号

点击 创建密钥

成功创建后即可在联系人中看到刚才建立的密钥

密钥导出 (iOS - Tessercube)

公钥和密钥可以很方便的导出

前往 选项卡

长按或者通过3D Touch刚才建立出来的密钥,会弹出菜单

选择导出密钥

这个时候会进行生物特征识别

使用 Touch ID 或者 Face ID 验证后,就可以一起导出公钥和私钥

密钥建立 (Android - OpenKeyChain)

打开OpenKeyChain,第一次打开你应该会在启动页面中看到 创建密钥

如果你不是第一次打开,通过主页右上角的 菜单按钮 进入 管理我的密钥 页面

然后选择 创建密钥

填写跟上面方法差不多的信息后 (例如名字, 邮件地址, 私钥密码设置) 即可建立成功

密钥导出 (Android - OpenKeyChain)

目前不清楚OpenKeyChain是否可以成功导出私钥至其他软件使用

使用

公钥私钥的使用非常简单

现在有很多支持PGP的程序

公钥可以分享给别人,别人可以使用你的公钥来加密出一个消息

私钥可以用来解锁别人使用你公钥加密的消息

上述程序 GPG, Tessercube, OpenKeyChain 都可以用于加密和解密