介绍
在本实验中,你将学习在 Linux 环境中使用 GPG(GNU Privacy Guard)加密和解密文件的核心技能。你将从生成自己的公钥/私钥对开始,这是 GPG 安全模型的基础。生成密钥后,你将练习核心操作:为自己加密一个文件,然后使用你的私钥和密码短语对其进行解密。
在掌握这些基础知识后,你将探索如何与他人安全地交换信息。这包括导出你的公钥以便分享,以及导入其他用户的公钥。你还将学习如何签署公钥以验证其真实性,并执行关键的密钥维护任务,例如备份私钥以及在密钥泄露时创建撤销证书。
在本实验中,你将学习在 Linux 环境中使用 GPG(GNU Privacy Guard)加密和解密文件的核心技能。你将从生成自己的公钥/私钥对开始,这是 GPG 安全模型的基础。生成密钥后,你将练习核心操作:为自己加密一个文件,然后使用你的私钥和密码短语对其进行解密。
在掌握这些基础知识后,你将探索如何与他人安全地交换信息。这包括导出你的公钥以便分享,以及导入其他用户的公钥。你还将学习如何签署公钥以验证其真实性,并执行关键的密钥维护任务,例如备份私钥以及在密钥泄露时创建撤销证书。
在这一步中,你将生成个人 GPG(GNU Privacy Guard)密钥对。GPG 密钥对由两个截然不同但相互关联的密钥组成:公钥和私钥。你可以将公钥分享给他人,以便他们为你加密文件。你必须严格保密你的私钥,因为它是唯一能够解密由你的公钥加密的文件。
首先,让我们确保系统中已安装提供 GPG 功能的 gnupg 软件包。
sudo apt-get update && sudo apt-get install -y gnupg
现在,你已准备好生成密钥对。gpg --gen-key 命令将引导你完成交互式过程。
在终端中执行以下命令:
gpg --gen-key
你会看到一条提示,说明此命令使用的是简化版密钥生成流程。对于更高级的选项,你可以使用 gpg --full-generate-key,但默认选项已足够满足本实验的需求。
系统会提示你输入以下信息:
labexlabex@example.comChange (N)ame, (E)mail, or (O)kay/(Q)uit? 时,输入 O 并按 Enter。系统将自动使用安全的默认设置:
注意:与旧版本不同,现代 GPG 在使用 --gen-key 生成密钥期间可能不会提示输入密码短语。如果你想为密钥添加密码短语以增强安全性,可以稍后使用以下命令:
gpg --edit-key labex
然后在 GPG 提示符下输入 passwd 来设置密码短语,最后输入 save 退出。
系统现在将生成你的密钥对。此过程需要随机数据(熵),可能需要几分钟时间。
完成后,你将看到类似于以下内容的确认消息:
gpg: key <KEY_ID> marked as ultimately trusted
gpg: revocation certificate stored as '/home/labex/.gnupg/openpgp-revocs.d/<FINGERPRINT>.rev'
public and secret key created and signed.
pub rsa3072 2025-07-01 [SC] [expires: 2027-07-01]
<FINGERPRINT>
uid labex <labex@example.com>
sub rsa3072 2025-07-01 [E] [expires: 2027-07-01]
密钥生成后,你可以查看它们。要查看你的新公钥,请运行:
gpg --list-keys
输出将列出你密钥环中的所有公钥,包括你刚刚创建的那个:
/home/labex/.gnupg/pubring.kbx
------------------------------
pub rsa3072 2025-07-01 [SC] [expires: 2027-07-01]
<FINGERPRINT>
uid [ultimate] labex <labex@example.com>
sub rsa3072 2025-07-01 [E] [expires: 2027-07-01]
要查看你的私钥,请运行:
gpg --list-secret-keys
输出结果类似,但它显示的是私钥(sec)而不是公钥(pub):
/home/labex/.gnupg/pubring.kbx
------------------------------
sec rsa3072 2025-07-01 [SC] [expires: 2027-07-01]
<FINGERPRINT>
uid [ultimate] labex <labex@example.com>
ssb rsa3072 2025-07-01 [E] [expires: 2027-07-01]
你现在已成功创建并验证了你的 GPG 密钥对。
在这一步中,你将使用生成的 GPG 密钥对来加密并解密一个文件。这是 GPG 的基本用例,允许你保护数据的机密性。加密会将你的可读数据转换为不可读格式,只有拥有正确私钥的人才能将其解密回原始形式。
首先,让我们创建一个简单的文本文件。所有操作都将在你当前的目录 ~/project 中进行。
echo "This is a secret message for the lab." > mytestfile.txt
现在,你可以使用你的公钥加密此文件。gpg -e 命令用于加密。你还需要使用 -r 标志指定加密消息的接收者,该接收者应是与你的 GPG 密钥关联的名称(labex)。
gpg -e -r labex mytestfile.txt
GPG 将使用你的公钥加密文件。系统不会提示你输入密码短语,因为加密是使用公钥完成的,而公钥不是秘密。
命令完成后,使用 ls 命令查看新的加密文件。
ls
你应该在输出中看到 mytestfile.txt.gpg 以及原始文件。
mytestfile.txt mytestfile.txt.gpg
文件 mytestfile.txt.gpg 包含加密数据。如果你尝试查看其内容,你将看到不可读的二进制数据。
现在,让我们解密该文件。为此,你将使用 gpg --decrypt 命令。由于你正在进行解密,GPG 将使用你的私钥。
我们将使用 --output 标志为解密后的内容指定一个新文件 mytestfile.txt.decrypted。这可以防止覆盖原始文件,并能清晰区分各个文件。
gpg --output mytestfile.txt.decrypted --decrypt mytestfile.txt.gpg
如果你的密钥设有密码短语,系统会提示你输入。如果在密钥生成期间未设置密码短语,解密将自动进行。你应该会看到类似以下的输出:
gpg: encrypted with 3072-bit RSA key, ID <KEY_ID>, created 2025-07-01
"labex <labex@example.com>"
解密后,你可以查看新文件的内容以确认它与原始消息匹配。
cat mytestfile.txt.decrypted
输出应该是你创建的原始文本:
This is a secret message for the lab.
你已成功为自己加密了一个文件,并使用你的 GPG 密钥对将其解密。
在这一步中,你将学习如何与他人交换公钥。要为他人加密文件,你需要他们的公钥。同样,如果有人想给你发送加密文件,他们需要你的公钥。这个过程涉及将你的公钥导出到文件,并将你从他人那里收到的公钥导入到你的 GPG 密钥环中。
首先,让我们导出你自己的公钥。你将使用 gpg --export 命令。最佳实践是使用 --armor 选项,它会创建一个基于文本(ASCII)的密钥版本,方便将其复制并粘贴到电子邮件或其他基于文本的通信渠道中。我们将把它保存到名为 labex.pub 的文件中。
在终端中运行以下命令。将 labex 替换为你生成密钥时使用的用户 ID。
gpg --export --armor -o labex.pub labex
你可以使用 ls 验证文件是否已创建:
ls
你应该在文件列表中看到 labex.pub。你也可以查看其内容:
cat labex.pub
输出将是一块以 -----BEGIN PGP PUBLIC KEY BLOCK----- 开头的文本。这就是你的公钥,你现在可以将其分享给他人。
接下来,你将模拟从另一位用户那里接收公钥并将其导入你的密钥环。在真实场景中,你会通过安全渠道从另一个人那里获得公钥。在本实验中,我们将创建一个临时的 Alice 密钥对,然后导出 Alice 的公钥来模拟这个过程。
首先,让我们为 Alice 临时生成一个密钥对。我们将使用批处理模式来自动执行此过程,无需交互式提示:
cat > alice-key-params << 'EOF'
Key-Type: RSA
Key-Length: 2048
Subkey-Type: RSA
Subkey-Length: 2048
Name-Real: Alice
Name-Email: alice@example.com
Expire-Date: 2y
%no-protection
%commit
EOF
现在使用参数文件生成 Alice 的密钥对:
gpg --batch --generate-key alice-key-params
你应该看到确认密钥生成的输出:
gpg: key <KEY_ID> marked as ultimately trusted
public and secret key created and signed.
现在将 Alice 的公钥导出到文件中,模拟你从 Alice 那里接收公钥的情景:
gpg --export --armor -o alice.pub alice@example.com
为了本实验的演示,我们还将从密钥环中删除 Alice 的私钥,因为在现实中你只会拥有她的公钥:
gpg --delete-secret-keys alice@example.com
出现提示时,输入 y 并按 Enter 确认删除。
gpg --delete-keys alice@example.com
再次输入 y 并按 Enter 确认删除。
现在你已经在 alice.pub 文件中拥有了 Alice 的公钥,模拟了你从其他用户那里接收公钥的过程。
清理临时密钥生成文件:
rm alice-key-params
现在你已经在一个文件中拥有了 Alice 的公钥,使用 gpg --import 命令将其导入你的 GPG 密钥环。
gpg --import alice.pub
你应该看到确认密钥已导入的输出:
gpg: key <KEY_ID>: public key "Alice <alice@example.com>" imported
gpg: Total number processed: 1
gpg: imported: 1
要确认 Alice 的密钥现在已在你的密钥环中,请再次列出你所有的公钥。
gpg --list-keys
输出现在将同时显示你的密钥(labex)和新导入的密钥(Alice)。
/home/labex/.gnupg/pubring.kbx
------------------------------
pub rsa3072 2025-07-01 [SC] [expires: 2027-07-01]
<FINGERPRINT_LABEX>
uid [ultimate] labex <labex@example.com>
sub rsa3072 2025-07-01 [E] [expires: 2027-07-01]
pub rsa2048 2025-07-01 [SC] [expires: 2027-07-01]
<FINGERPRINT_ALICE>
uid [ unknown] Alice <alice@example.com>
sub rsa2048 2025-07-01 [E] [expires: 2027-07-01]
请注意,Alice 的密钥被标记为 [ unknown](未知)信任。你将在下一步中学习如何管理密钥信任。
在这一步中,你将学习如何对收到的公钥建立信任,然后使用它为该密钥的所有者加密文件。当你导入公钥时,GPG 无法得知它是否真实。通过使用你自己的私钥对该密钥进行「签署」,你就创建了一个加密背书,本质上是在告诉你的 GPG 设置:「我信任这个密钥属于这个人。」这是 GPG「信任网络」(Web of Trust)模型中的一个基本概念。
首先,你需要为你上一步导入的「Alice」公钥签名。你将使用 gpg --sign-key 命令,通过其电子邮件地址(alice@example.com)来识别该密钥。
gpg --sign-key alice@example.com
GPG 将显示 Alice 密钥的详细信息,并询问你是否确认要对其签名。
pub rsa2048/XXXXXXXXXXXXXXXX 2025-07-01
created: 2025-07-01 expires: 2027-07-01 usage: SC
trust: unknown validity: unknown
sub rsa2048/YYYYYYYYYYYYYYYY 2025-07-01
created: 2025-07-01 expires: 2027-07-01 usage: E
[ unknown] (1). Alice <alice@example.com>
Really sign? (y/N)
输入 y 并按 Enter。如果你的密钥设有密码短语,系统会提示你输入。这是因为签名是一种加密操作,只能使用你的私钥执行。如果提示,请输入你的密码短语并按 Enter。
完成后,你可以通过再次列出密钥来验证签名。
gpg --list-keys
请注意 Alice 密钥条目的变化。信任级别不再是 [unknown]。它现在显示为 [ultimate](绝对信任),因为你通过签名明确信任了它。
/home/labex/.gnupg/pubring.kbx
------------------------------
pub rsa3072 2025-07-01 [SC] [expires: 2027-07-01]
<FINGERPRINT_LABEX>
uid [ultimate] labex <labex@example.com>
sub rsa3072 2025-07-01 [E] [expires: 2027-07-01]
pub rsa2048 2025-07-01 [SC] [expires: 2027-07-01]
<FINGERPRINT_ALICE>
uid [ultimate] Alice <alice@example.com>
sub rsa2048 2025-07-01 [E] [expires: 2027-07-01]
现在你已经拥有了 Alice 的受信任公钥,你可以加密一个只有她才能打开的文件。首先,为此目的创建一个新文件。
echo "This is a confidential message for Alice." > message-for-alice.txt
接下来,使用 gpg -e 命令加密此文件。这次,使用 -r 标志指定 Alice 为接收者。
gpg -e -r alice@example.com message-for-alice.txt
GPG 将使用 Alice 的公钥执行加密。使用 ls 查看结果。
ls
你将在目录中看到新的加密文件 message-for-alice.txt.gpg。
labex.pub mytestfile.txt
alice.pub mytestfile.txt.decrypted
message-for-alice.txt mytestfile.txt.gpg
message-for-alice.txt.gpg
该文件现在已安全加密。只有能够访问 Alice 私钥(及其密码短语)的人才能解密并阅读该消息。
在最后一步中,你将为你的 GPG 密钥执行两项关键的维护任务:创建私钥的安全备份和生成撤销证书。你的私钥是不可替代的;如果你丢失了它,你将失去对所有由相应公钥加密的数据的访问权限。撤销证书是你的安全网,如果你的私钥丢失或泄露,它允许你使公钥失效。
首先,让我们创建私钥的备份。这是管理 GPG 密钥最重要的步骤之一。
gpg --export-secret-keys 命令用于此目的。我们将使用 --armor 标志来创建一个 ASCII 封装的文本文件,它易于存储和传输。你必须通过用户 ID 指定要导出的密钥。
gpg --export-secret-keys --armor -o gpgkey.asc labex
此命令将用户 labex 的私钥导出到名为 gpgkey.asc 的文件中。此文件极其敏感。 在现实场景中,你会将此文件存储在非常安全的离线位置,例如加密的 USB 驱动器或保险库中。
接下来,你将创建一个撤销证书。这应该在密钥生成后立即完成,并与你的私钥备份分开安全存储。如果你丢失了私钥或私钥被盗,你可以发布此证书以告知他人该密钥不应再被使用或信任。
使用 gpg --gen-revoke 命令。我们将使用 --output 标志将证书保存到名为 revoke.asc 的文件中。
gpg --output revoke.asc --gen-revoke labex
你将通过交互式过程得到引导:
Create a revocation certificate for this key? (y/N) 时,输入 y 并按 Enter。Enter 接受默认值 0 = No reason specified(未指定原因)。Enter 保持为空即可。Is this okay? (y/N) 时,输入 y 并按 Enter 确认详细信息。Enter。你将看到撤销证书已创建的确认信息。
Revocation certificate created.
Please move it to a medium which you can hide away; if Mallory gets
access to this certificate he can use it to make your key unusable.
It is smart to print this certificate and store it away, just in case
your media become unreadable. But have some caution: The printout
might be scanned and reconstructed by a determined attacker.
使用 ls 命令验证 ~/project 目录中是否已创建这两个新文件。
ls
你现在应该在文件列表中看到 gpgkey.asc 和 revoke.asc。你已成功执行了基本的密钥维护。
在本实验中,你学习了在 Linux 环境中 GNU Privacy Guard (GPG) 的基本操作。你首先使用 gpg --gen-key 命令生成了包含公钥和私钥的个人 GPG 密钥对。此过程涉及选择密钥规格并创建受安全密码短语保护的用户 ID。生成密钥后,你通过使用 gpg -e 为自己加密本地文件,并随后使用私钥和 gpg --decrypt 命令对其进行解密,练习了 GPG 的核心功能,演示了非对称加密的基本原理。
在这些基础之上,你探索了如何与他人安全通信。你学习了使用 gpg --export 分享你的公钥,以及使用 gpg --import 接收其他用户的公钥。本实验还涵盖了通过签署导入的公钥来建立信任的重要性,并随后使用该公钥专门为该用户加密文件。最后,你执行了关键的密钥维护任务,包括使用 gpg --export-secret-keys 备份私钥,以及使用 gpg --gen-revoke 创建撤销证书,以便在密钥对泄露时使其失效。