# 如何建立一个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发行版中

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

# 加密和签名流程

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

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

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

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

# 仅签名,无加密

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

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

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

# 仅加密,无签名

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

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

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

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

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

# 加密,并且签名

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

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

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

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

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

# 开始建立密钥

# 密钥建立 (Windows - Gpg4win)

Windows下使用的工具为 Gpg4win

安装完成后打开 Kleopatra

点击 文件 下的 新建密钥对

选择 创建个人OpenPGP密钥对

输入 姓名电子邮件

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

创建成功

# 密钥导出 (Windows - Gpg4win)

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

# 密钥建立 (Ubuntu - GPG)

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

gpg --gen-key
1

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

然后弹出以下信息:

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? 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

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

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

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

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

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

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

接下来密钥就成功建立了

# 密钥导出 (Ubuntu - GPG)

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

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

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

# 密钥建立 (iOS - Tessercube)

在iOS下使用的工具为 Tessercube

该工具需要在 中国区 以外的Apple ID才可以下载

下载后点击

点击 右上角 加号

点击 创建密钥

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

# 密钥导出 (iOS - Tessercube)

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

前往 选项卡

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

选择导出密钥

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

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

# 密钥建立 (Android - OpenKeyChain)

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

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

然后选择 创建密钥

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

# 密钥导出 (Android - OpenKeyChain)

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

# 使用

公钥私钥的使用非常简单

现在有很多支持PGP的程序

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

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

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