【笔记】PGP学习笔记

前言

PGP(英语:Pretty Good Privacy,直译:优良保密协议)是一套用于讯息加密、验证的应用程序。(维基百科) GNU Privacy Guard(GnuPG 或 GPG)是一个密码学软件,用于加密、签名通信内容及管理非对称密码学的密钥。GnuPG 是自由软件,遵循 IETF 订定的 OpenPGP 技术标准设计,并与 PGP 保持兼容。(维基百科

缩写

A:身份验证(Authentication) C:证明(Certify) E:加密(Encrypt) S:签名(Sign) ?:未知(Unknown capability)

sec:主私钥(Secret Key) pub:主公钥(Public Key) ssb:子私钥(Secret SuBkey) sub:子公钥(Public Subkey)

安装GnuPG命令行工具gpg

MacOS

1
brew install gpg

生成主密钥对

Linux

1
gpg --gen-key

MacOS

1
gpg --full-gen-key
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
gpg (GnuPG) 2.4.3; Copyright (C) 2023 g10 Code GmbH
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

gpg: 目录‘~/.gnupg’已创建
请选择您要使用的密钥类型:
(1) RSA 和 RSA
(2) DSA 和 Elgamal
(3) DSA(仅用于签名)
(4) RSA(仅用于签名)
(9) ECC(签名和加密) *默认*
(10) ECC(仅用于签名)
(14)卡中现有密钥
您的选择是? 1
RSA 密钥的长度应在 1024 位与 4096 位之间。
您想要使用的密钥长度?(3072) 3072
请求的密钥长度是 3072 位
请设定这个密钥的有效期限。
0 = 密钥永不过期
<n> = 密钥在 n 天后过期
<n>w = 密钥在 n 周后过期
<n>m = 密钥在 n 月后过期
<n>y = 密钥在 n 年后过期
密钥的有效期限是?(0) 2y
密钥于 二 10/ 7 18:24:13 2025 CST 过期
这些内容正确吗? (y/N) y

GnuPG 需要构建用户标识以辨认您的密钥。

真实姓名: FeiJu
电子邮件地址: [email protected]
注释: FeiJu's PGP
您正在使用‘utf-8’字符集。
您选定了此用户标识:
“FeiJu (FeiJu's PGP) <[email protected]>”

更改姓名(N)、注释(C)、电子邮件地址(E)或确定(O)/退出(Q)? O

┌─────────────────────────────────────────────────┐
│ 请输入密码以
│ 保护您的新密钥

│ 密码: ________________________________________

│ <确认(O)> <取消(C)>
└─────────────────────────────────────────────────┘

我们需要生成大量的随机字节。在质数生成期间做些其他操作(敲打键盘
、移动鼠标、读写硬盘之类的)将会是一个不错的主意;这会让随机数
发生器有更好的机会获得足够的熵。

┌─────────────────────────────────────────────────┐
│ 请重新输入此密码

│ 密码: ________________________________________

│ <确认(O)> <取消(C)>
└─────────────────────────────────────────────────┘

我们需要生成大量的随机字节。在质数生成期间做些其他操作(敲打键盘
、移动鼠标、读写硬盘之类的)将会是一个不错的主意;这会让随机数
发生器有更好的机会获得足够的熵。

gpg: ~/.gnupg/trustdb.gpg:建立了信任度数据库
gpg: 目录‘~/.gnupg/openpgp-revocs.d’已创建
gpg: 吊销证书已被存储为‘~/.gnupg/openpgp-revocs.d/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.rev’
公钥和私钥已经生成并被签名。

pub rsa3072 2023-10-08 [SC] [有效至:2025-10-07]
4F6121ED450D74521F5877A48E968932DA4D8595
uid FeiJu (FeiJu's PGP) <[email protected]>
sub rsa3072 2023-10-08 [E] [有效至:2025-10-07]

通过主密钥对签发子密钥对

  1. 进入密钥对编辑模式

<id>:真实姓名、电子邮件地址、密钥对ID,其中一种即可

1
gpg --edit-key <id>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
gpg (GnuPG) 2.4.3; Copyright (C) 2023 g10 Code GmbH
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

私钥可用。

gpg: 正在检查信任度数据库
gpg: marginals needed: 3 completes needed: 1 trust model: pgp
gpg: 深度:0 有效性: 1 已签名: 0 信任度:0-,0q,0n,0m,0f,1u
gpg: 下次信任度数据库检查将于 2025-10-07 进行
sec rsa3072/8E968932DA4D8595
创建于:2023-10-08 有效至:2025-10-07 可用于:SC
信任度:绝对 有效性:绝对
ssb rsa3072/49623183FA53B6AB
创建于:2023-10-08 有效至:2025-10-07 可用于:E
[ 绝对 ] (1). FeiJu (FeiJu's PGP) <[email protected]>
  1. 通过主私钥添加子密钥对
1
gpg> addkey
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
请选择您要使用的密钥类型:
(3) DSA(仅用于签名)
(4) RSA(仅用于签名)
(5) ElGamal(仅用于加密)
(6) RSA(仅用于加密)
(10) ECC(仅用于签名)
(12) ECC(仅用于加密)
(14)卡中现有密钥
您的选择是? 6
RSA 密钥的长度应在 1024 位与 4096 位之间。
您想要使用的密钥长度?(3072) 3072
请求的密钥长度是 3072 位
请设定这个密钥的有效期限。
0 = 密钥永不过期
<n> = 密钥在 n 天后过期
<n>w = 密钥在 n 周后过期
<n>m = 密钥在 n 月后过期
<n>y = 密钥在 n 年后过期
密钥的有效期限是?(0) 2y
密钥于 二 10/ 7 18:28:27 2025 CST 过期
这些内容正确吗? (y/N) y
真的要创建吗?(y/N) y

┌───────────────────────────────────────────────────┐
│ 请输入密码以解锁 OpenPGP 私钥:
│ "FeiJu (FeiJu's PGP) <[email protected]>"
│ 3072 位 RSA 密钥,标识 8E968932DA4D8595,
│ 创建于 2023-10-08.


│ 密码: __________________________________________

│ <确认(O)> <取消(C)>
└───────────────────────────────────────────────────┘

我们需要生成大量的随机字节。在质数生成期间做些其他操作(敲打键盘
、移动鼠标、读写硬盘之类的)将会是一个不错的主意;这会让随机数
发生器有更好的机会获得足够的熵。

sec rsa3072/8E968932DA4D8595
创建于:2023-10-08 有效至:2025-10-07 可用于:SC
信任度:绝对 有效性:绝对
ssb rsa3072/49623183FA53B6AB
创建于:2023-10-08 有效至:2025-10-07 可用于:E
ssb rsa3072/59476D3493FE4650
创建于:2023-10-08 有效至:2025-10-07 可用于:S
[ 绝对 ] (1). FeiJu (FeiJu's PGP) <[email protected]>
  1. 保存变更
1
gpg> save

查看密钥

查看主公钥和所有子公钥

1
gpg --list-keys
1
2
3
4
5
6
7
[keyboxd]
---------
pub rsa3072 2023-10-08 [SC] [有效至:2025-10-07]
4F6121ED450D74521F5877A48E968932DA4D8595
uid [ 绝对 ] FeiJu (FeiJu's PGP) <[email protected]>
sub rsa3072 2023-10-08 [E] [有效至:2025-10-07]
sub rsa3072 2023-10-08 [S] [有效至:2025-10-07]
  • 简写
1
gpg -k

查看主私钥和所有子私钥

1
gpg --list-secret-keys
1
2
3
4
5
6
7
[keyboxd]
---------
sec rsa3072 2023-10-08 [SC] [有效至:2025-10-07]
4F6121ED450D74521F5877A48E968932DA4D8595
uid [ 绝对 ] FeiJu (FeiJu's PGP) <[email protected]>
ssb rsa3072 2023-10-08 [E] [有效至:2025-10-07]
ssb rsa3072 2023-10-08 [S] [有效至:2025-10-07]
  • 简写
1
gpg -K

删除密钥对

删除主密钥对

  • 删除主密钥对时,子密钥对也会被删除

删除公钥

  • 删除公钥时私钥也会被删除
1
gpg --delete-keys <id>

删除私钥

1
gpg --delete-secret-keys <id>

删除子密钥对

  1. 进入密钥对编辑模式

<id>:真实姓名、电子邮件地址、密钥对ID,其中一种即可

1
gpg --edit-key <id>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
gpg (GnuPG) 2.4.3; Copyright (C) 2023 g10 Code GmbH
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

私钥可用。

sec rsa3072/8E968932DA4D8595
创建于:2023-10-08 有效至:2025-10-07 可用于:SC
信任度:绝对 有效性:绝对
ssb rsa3072/49623183FA53B6AB
创建于:2023-10-08 有效至:2025-10-07 可用于:E
ssb rsa3072/59476D3493FE4650
创建于:2023-10-08 有效至:2025-10-07 可用于:S
[ 绝对 ] (1). FeiJu (FeiJu's PGP) <[email protected]>
  1. 选择子密钥对
1
gpg> key 59476D3493FE4650
1
2
3
4
5
6
7
8
sec  rsa3072/8E968932DA4D8595
创建于:2023-10-08 有效至:2025-10-07 可用于:SC
信任度:绝对 有效性:绝对
ssb rsa3072/49623183FA53B6AB
创建于:2023-10-08 有效至:2025-10-07 可用于:E
ssb* rsa3072/59476D3493FE4650
创建于:2023-10-08 有效至:2025-10-07 可用于:S
[ 绝对 ] (1). FeiJu (FeiJu's PGP) <[email protected]>
  1. 删除子密钥对
1
gpg> delkey 59476D3493FE4650
1
2
3
4
5
6
7
8
您真的要删除此密钥吗?(y/N) y

sec rsa3072/8E968932DA4D8595
创建于:2023-10-08 有效至:2025-10-07 可用于:SC
信任度:绝对 有效性:绝对
ssb rsa3072/49623183FA53B6AB
创建于:2023-10-08 有效至:2025-10-07 可用于:E
[ 绝对 ] (1). FeiJu (FeiJu's PGP) <[email protected]>
  1. 保存变更
1
gpg> save

密钥的导入和导出

  • 将自己的公钥导出交给其他人,允许其他人通过自己的公钥加密,并将加密信息发送给自己
  • 将对方的公钥导入到自己的库中,将加密后的信息发送给对方

导出公钥

在命令行上显示

--armor:以ASCII码显示

1
gpg --armor --export-options export-minimal --export <id>

导出为文件

--output public.key:指定文件存储路径

1
gpg --armor --output public.key --export <id>

导出私钥

在命令行上显示

1
gpg --armor --export-options export-minimal --export-secret-keys <id>
1
2
3
4
5
6
7
8
9
10
11
┌───────────────────────────────────────────────────┐
│ 请输入密码以导出 OpenPGP 私钥:
│ "FeiJu (FeiJu's PGP) <[email protected]>"
│ 3072 位 RSA 密钥,标识 8E968932DA4D8595,
│ 创建于 2023-10-08.


│ 密码: __________________________________________

│ <确认(O)> <取消(C)>
└───────────────────────────────────────────────────┘

导出为文件

1
gpg --armor --output public.key --export-secret-keys <id>
1
2
3
4
5
6
7
8
9
10
11
┌───────────────────────────────────────────────────┐
│ 请输入密码以导出 OpenPGP 私钥:
│ "FeiJu (FeiJu's PGP) <[email protected]>"
│ 3072 位 RSA 密钥,标识 8E968932DA4D8595,
│ 创建于 2023-10-08.


│ 密码: __________________________________________

│ <确认(O)> <取消(C)>
└───────────────────────────────────────────────────┘

导入密钥

导入公钥

  • 通常用于导入其他人的公钥
1
gpg --import public.key

导入私钥

  • 通常用于还原自己的密钥
1
gpg --import private.key

通过密钥对加解密

通过指定公钥加密文件

--encrypt text.txt:指定加密前的文件

1
gpg --recipient <id> --encrypt text.txt
  • 加密后会在当前目录下生成.gpg文件

通过自己的私钥解密文件

--decrypt text.gpg:指定解密前的文件

1
gpg --decrypt text.txt.gpg
  • 解密后会将明文输出

签名

仅签名

  • 默认情况下使用最新未被吊销的具有S功能的密钥
1
gpg --local-user <id> --armor --detach-sign text.txt
  • 签名后会产生text.txt.asc签名文件

签名并且加密

--local-user <my_id>:指定签名密钥,通常是自己的密钥 --recipient <other_id>:指定加密密钥,通常是其他人的密钥 --encrypt text.txt:指定加密前的文件 --output text.gpg:指定加密后的文件

1
gpg --local-user <my_id> --recipient <other_id> --armor --sign --encrypt text.txt --output text.gpg

校验签名

text.txt.asc:签名文件 text.txt:原文件

1
gpg --verify text.txt.asc text.txt

公钥服务器

上传自己的公钥到公钥服务器

--keyserver <domain>:指定公钥服务器域名 > keys.openpgp.org > keyserver.ubuntu.com

1
gpg --send-keys <id> --keyserver <domain>

从公钥服务器获取其他人的公钥

搜索其他人的公钥

1
gpg --keyserver <domain> --search-keys <id>

导入其他人的公钥

1
gpg --keyserver <domain> --recv-keys <id>

完成

参考文献

稀土掘金——UCloud技术团队 稀土掘金——UCloud技术团队 CSDN——willingtolove Hunter Wittenborn——IT'S FOSS Xingyu.Wang——Linux中国 知乎——QuietHeart