前言
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
生成主密钥对
Linux
MacOS
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]
通过主密钥对签发子密钥对
进入密钥对编辑模式
<id>
:真实姓名、电子邮件地址、密钥对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 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 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 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 --delete-secret-keys <id>
删除子密钥对
进入密钥对编辑模式
<id>
:真实姓名、电子邮件地址、密钥对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 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 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] >
保存变更
密钥的导入和导出
将自己的公钥导出交给其他人,允许其他人通过自己的公钥加密,并将加密信息发送给自己
将对方的公钥导入到自己的库中,将加密后的信息发送给对方
导出公钥
在命令行上显示
--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 private.key
通过密钥对加解密
通过指定公钥加密文件
--encrypt text.txt
:指定加密前的文件
1 gpg --recipient <id> --encrypt text.txt
通过自己的私钥解密文件
--decrypt text.gpg
:指定解密前的文件
1 gpg --decrypt text.txt.gpg
签名
仅签名
1 gpg --local-user <id> --armor --detach-sign text.txt
签名并且加密
--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