在 Linux 中使用 GPG 加密和解密文件

LinuxLinuxBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

引言

在本实验中,你将学习使用 GPG (GNU Privacy Guard) 在 Linux 环境中加密和解密文件的必备技能。你将从生成自己的公钥/私钥对开始,这是 GPG 安全模型的基础。在生成密钥之后,你将练习将文件加密给自己,然后使用你的私钥和密码解密它的核心操作。

在掌握了这些基础知识后,你将探索如何与他人安全地交换信息。这包括导出你的公钥以供分享,以及导入其他用户的公钥。你还将学习如何签名公钥以验证其真实性,并执行关键的密钥维护任务,例如备份你的私钥以及在密钥泄露时创建吊销证书。

使用 gpg --gen-key 生成你的 GPG 密钥对

在此步骤中,你将生成你的个人 GPG (GNU Privacy Guard) 密钥对。GPG 密钥对包含两个不同但相关的密钥:公钥和私钥。你可以将公钥分享给他人,以便他们为你加密文件。你必须妥善保管你的私钥,因为它是唯一能够解密用你的公钥加密的文件的密钥。

首先,让我们确保 gnupg 包(提供 GPG 功能)已安装在你的系统上。

sudo apt-get update && sudo apt-get install -y gnupg

现在,你已准备好生成你的密钥对。gpg --gen-key 命令将引导你完成一个交互式过程。

在你的终端中执行以下命令:

gpg --gen-key

你将看到一条提示,说明此命令使用简化的密钥生成方式。如需更高级的选项,你可以使用 gpg --full-generate-key,但默认选项已足够满足本次实验的需求。

系统将提示你输入以下信息:

  1. Real name (真实姓名): 输入 labex
  2. Email address (电子邮件地址): 输入 [email protected]
  3. Confirm User ID (确认用户 ID): 检查你的信息。当提示 Change (N)ame, (E)mail, or (O)kay/(Q)uit? 时,输入 O 并按 Enter

系统将自动使用安全的默认设置:

  • Key type (密钥类型): RSA and RSA (默认)
  • Key size (密钥大小): 3072 bits (安全的默认值)
  • Key validity (密钥有效期): 2 年 (自动过期以确保安全)

注意: 与旧版本不同,现代 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 <[email protected]>
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 <[email protected]>
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 <[email protected]>
ssb   rsa3072 2025-07-01 [E] [expires: 2027-07-01]

你现在已成功创建并验证了你的 GPG 密钥对。

使用 gpg -e 和 gpg --decrypt 加密和解密本地文件

在此步骤中,你将使用生成的 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 <[email protected]>"

解密完成后,你可以查看新文件的内容,确认它与原始消息匹配。

cat mytestfile.txt.decrypted

输出应该是你创建的原始文本:

This is a secret message for the lab.

你已成功使用 GPG 密钥对为自己加密了一个文件,然后又将其解密。

使用 gpg --export 和 gpg --import 交换公钥

在此步骤中,你将学习如何与他人交换公钥。要为他人加密文件,你需要他们的公钥。同样,如果有人想发送加密文件给你,他们需要你的公钥。此过程涉及将你的公钥导出到一个文件,并将你从他人那里收到的公钥导入到你的 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: [email protected]
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 [email protected]

为了本次实验演示,我们还将从密钥环中删除 Alice 的私钥,因为在现实中你只会拥有她的公钥:

gpg --delete-secret-keys [email protected]

在提示时,通过输入 y 并按 Enter 来确认删除。

gpg --delete-keys [email protected]

再次,通过输入 y 并按 Enter 来确认删除。

现在你已将 Alice 的公钥保存在 alice.pub 文件中,模拟了你如何从其他用户那里收到它。

清理临时密钥生成文件:

rm alice-key-params

现在你已将 Alice 的公钥保存在文件中,使用 gpg --import 命令将其导入到你的 GPG 密钥环中。

gpg --import alice.pub

你应该会看到确认密钥已导入的输出:

gpg: key <KEY_ID>: public key "Alice <[email protected]>" 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 <[email protected]>
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 <[email protected]>
sub   rsa2048 2025-07-01 [E] [expires: 2027-07-01]

请注意,Alice 的密钥标记为 [ unknown] 信任。你将在下一步学习如何管理密钥信任。

签名公钥并为其他用户加密文件

在此步骤中,你将学习如何建立对已收到公钥的信任,然后使用它为该用户加密文件。当你导入公钥时,GPG 无法知道它是否真实。通过用你自己的私钥“签名”该密钥,你正在创建一个加密的背书,本质上是在告诉你的 GPG 设置,“我相信这个密钥属于这个人。”这是 GPG“信任网络”(Web of Trust)模型的一个基本概念。

首先,你需要签名你在上一步导入的“Alice”的公钥。你将使用 gpg --sign-key 命令,通过其电子邮件地址([email protected])来识别密钥。

gpg --sign-key [email protected]

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 <[email protected]>

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 <[email protected]>
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 <[email protected]>
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 [email protected] 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 --export-secret-keys 和 gpg --gen-revoke 执行密钥维护

在最后一步中,你将执行两个关键的密钥维护任务:创建你的私钥的安全备份和生成一个吊销证书。你的私钥是不可替代的;如果你丢失了它,你将失去对所有使用相应公钥加密的数据的访问权限。吊销证书是你的安全网,如果你的私钥丢失或被泄露,你可以使用它来使你的公钥失效。

首先,让我们创建你的私钥备份。这是管理 GPG 密钥最重要的步骤之一。

gpg --export-secret-keys 命令用于此目的。我们将使用 --armor 标志来创建一个 ASCII armored 文本文件,该文件易于存储和传输。你必须通过用户 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

你将通过一个交互式过程进行引导:

  1. 当被问及 Create a revocation certificate for this key? (y/N) 时,输入 y 并按 Enter
  2. 系统将提示你选择吊销原因。为了本次实验,按 Enter 接受默认的 0 = No reason specified
  3. 你可以添加一个可选的描述。现在,只需按 Enter 留空。
  4. 最后,当被问及 Is this okay? (y/N) 时,通过输入 y 并按 Enter 来确认详细信息。
  5. 如果你的密钥有密码短语,GPG 将要求输入密码短语以授权创建此证书。如果提示,请输入你的密码短语并按 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.ascrevoke.asc。你已成功执行了重要的密钥维护操作。

总结

在本实验中,你学习了 GNU Privacy Guard (GPG) 在 Linux 环境下的基本操作。你首先使用 gpg --gen-key 命令生成了一个个人 GPG 密钥对,包括一个公钥和一个私钥。此过程涉及选择密钥规格并创建一个受安全密码短语保护的用户 ID。密钥生成后,你通过 gpg -e 为自己加密本地文件,然后使用你的私钥和 gpg --decrypt 命令解密该文件,演示了非对称加密的基本原理,从而实践了 GPG 的核心功能。

在掌握了这些基础知识后,你探索了如何与他人安全地通信。你学会了使用 gpg --export 来共享你的公钥,以及使用 gpg --import 来接收其他用户的公钥,从而进行公钥交换。本实验还涵盖了通过签名导入的公钥来建立信任的重要性,然后使用该公钥为特定用户加密文件。最后,你执行了重要的密钥维护任务,包括使用 gpg --export-secret-keys 备份你的私钥,以及使用 gpg --gen-revoke 创建吊销证书,以便在密钥对泄露时使其失效。