如何在 Linux 上使用 GPG 加密和解密文件

在数字时代,保护个人信息至关重要。Linux 系统提供了一个强大的工具,即 GPG (GNU Privacy Guard) 命令,它能够帮助您加密和解密文件,确保只有预定的接收者可以访问您的秘密信息。

GPG 遵循 OpenPGP 标准,这是一种广泛认可的加密协议,最初由 菲尔·齐默尔曼于 1991 年开发,名为“相当好的隐私”(PGP)。GPG 采用公钥加密技术,其中每个人拥有一个私钥和一个公钥。 公钥可以用来加密只有私钥才能解密的内容。

为了安全地发送文件,您需要使用自己的私钥和接收者的公钥对其进行加密。接收者需要使用他们的私钥和您的公钥来解密文件。

重要的是,公钥可以安全地共享,甚至可以公开。 实际上,存在专门用于存储和分发公钥的服务器。 然而,私钥必须严格保密,并且绝对不能泄露给任何人。如果您的公钥是公开的,请务必妥善保管您的私钥。

配置 GPG 可能比使用它稍微复杂,但通常只需设置一次即可。

生成您的密钥

几乎所有主流 Linux 发行版,如 Ubuntu、Fedora 和 Manjaro,都预装了 GPG 命令。

尽管 GPG 常用于加密电子邮件,但您也可以使用它来加密其他类型的文件。 为了生成密钥,您必须将电子邮件地址与密钥相关联。请务必选择您常用的电子邮件地址。

要生成密钥,请在终端中使用以下命令。 --full-generate-key 选项启动一个交互式会话,您将被要求选择加密类型、密钥长度以及密钥的有效期。同时,系统会要求您设置密码,请务必记住它。选择一个强密码,如由三到四个词组成的短语,并包含标点符号。

gpg --full-generate-key

您需要从菜单中选择加密类型。通常,选择默认值 (1) 即可。

接下来,需要选择加密密钥的位长,您可以按回车键接受默认值。

您将被要求指定密钥的有效期。如果您只是在测试系统,选择较短的有效期即可(如 5 天)。如果您打算长期使用此密钥,则应选择更长的有效期(如 1 年),这意味着您需要在一年后更新密钥。使用 “Y” 确认您的选择。

您需要输入您的姓名、电子邮件地址和评论(可选)。

接下来,系统会提示您输入密码。 请务必记住它,因为每次使用密钥时都需要输入密码。

在输入密码后点击“确定”按钮。 密钥生成后,您将返回到命令提示符。

生成吊销证书

为了应对私钥泄露的情况,您需要生成撤销证书。此证书能够使旧密钥失效,从而您可以生成新的密钥。将证书存储在安全的地方。

您需要使用 --output 选项指定证书的文件名,并使用 --gen-revoke 选项生成撤销证书。使用生成密钥时使用的邮箱地址。

gpg --output ~/revocation.crt --gen-revoke [email protected]

使用 “Y” 确认生成证书,系统将要求您指定生成证书的原因。 由于我们提前生成证书,所以选择 “1” 作为合理推测。 按回车键。

您可以输入描述,或者按两次回车键来跳过描述。

您需要再次确认设置,按 “Y” 并按回车键。

生成证书后,会显示一条消息,强调保存此证书的重要性。

密码学中经常使用 爱丽丝和鲍勃 作为通信双方的例子,另外还有 Eve 和 Mallory,他们分别是窃听者和恶意攻击者。 我们需要关注的是,必须确保撤销证书的安全。

为了确保证书的安全,请限制证书的访问权限,仅允许所有者访问:

chmod 600 ~/revocation.crt

使用 ls -l 命令来验证权限:

ls -l

现在的权限设置可以确保只有所有者(您)才能访问证书。

导入他人的公钥

要加密他人可以解密的消息,您需要获得他们的公钥。

如果对方以文件形式向您提供了公钥,则可以使用以下命令导入它。假设密钥文件名为 “mary-geek.key”。

gpg --import mary-geek.key

密钥导入后,您会看到与其关联的姓名和电子邮件地址。 请务必验证这是否是您期望的人的密钥。

另一种获取公钥的方法是通过公钥服务器。这些服务器存储着来自世界各地的公钥,并且会定期同步,确保密钥的广泛可用性。

MIT 公钥服务器是一个流行的选择。如果有人最近上传了密钥,可能需要几天才能在服务器上看到它。

要搜索公钥,需要使用 --keyserver 选项指定服务器,并使用 --search-keys 选项指定要搜索的姓名或电子邮件地址。

gpg --keyserver pgp.mit.edu --search-keys [email protected]

系统会列出匹配的密钥,并为其编号。要导入密钥,请键入相应的数字并按回车键。例如,如果只有一个匹配项,键入 1 并按回车键。

密钥导入成功后,您会看到与其关联的姓名和电子邮件地址。

验证和签署密钥

如果您直接从某人那里收到公钥文件,您可以确信该密钥属于那个人。但是,如果您是从公钥服务器下载的,则可能需要验证该密钥的真实性。

您可以使用 --fingerprint 选项生成一个密钥指纹,它是一个由十组四个十六进制字符组成的序列。 与密钥持有人核实此指纹能够帮助您验证密钥的真实性。

gpg --fingerprint [email protected]

系统会生成密钥指纹,与您从密钥持有人处获得的指纹进行比较。

确认密钥的真实性后,您可以对其进行签名。即使不签名,您仍然可以使用该密钥来加密和解密消息,但 GPG 每次都会提醒您该密钥未签名。您可以使用 --sign-key 选项并提供该用户的电子邮件地址来签名密钥。

gpg --sign-key [email protected]

系统会显示密钥信息,并提示您确认是否签名。 按 “Y” 并回车键即可签名。

如何共享您的公钥

要将您的公钥作为文件共享,需要从本地 GPG 密钥存储导出它。使用 --export 选项并指定您的电子邮件地址。使用 --output 选项指定导出文件的名称。 使用 --armor 选项生成 ASCII 格式的输出,而不是二进制格式。

gpg --output ~/dave-geek.key --armor --export [email protected]

您可以使用 less 命令查看密钥文件的内容。

less dave-geek.key

密钥文件的内容如下所示:

您也可以将您的公钥上传到公钥服务器。使用 --send-keys 选项,并指定公钥服务器的地址。 要标识要发送的密钥,需要提供密钥的指纹。 请注意,指纹的字符集之间没有空格。

gpg --send-keys --keyserver pgp.mit.edu 31A4E3BE6C022830A804DA0EE9E4D6D0F64EEED4

系统会提示您密钥已发送的确认信息。

加密文件

假设您要将一个名为 “Raven.txt” 的文件发送给 Mary。 可以使用以下命令加密该文件。使用 --encrypt 选项加密文件, --sign 选项使用您的详细信息签名文件, --armor 选项生成 ASCII 格式的文件, -r (recipient) 选项指定接收者的电子邮件地址。

gpg --encrypt --sign --armor -r [email protected]

加密文件的名称与原始文件名相同,但会附加 “.asc” 后缀。可以使用 less 命令查看文件内容。

less Raven.txt.asc

现在,该文件只有拥有您的公钥和 Mary 的私钥的人才能解密。 只有玛丽应该同时拥有这两个密钥。

您可以将加密的文件发送给 Mary,确保只有她才能解密它。

解密文件

假设您收到了 Mary 发送的加密文件,名为 “coded.asc”。您可以使用 --decrypt 选项轻松解密它。 我们将把解密后的输出重定向到名为 “plain.txt” 的文件中。

请注意,您不需要指定文件的发送者,因为 GPG 可以从加密文件中确定。

gpg --decrypt coded.asc > plain.txt

查看解密后的文件 “plain.txt”:

less plain.txt

文件已成功解密。

刷新您的密钥

您应该定期检查 GPG 密钥,并刷新任何已更改的密钥。您可以在收到新联系人的密钥时或每隔几个月执行此操作。

使用 --refresh-keys 选项执行此操作。使用 --keyserver 选项指定公钥服务器。一旦密钥在公钥服务器之间同步,您选择哪个服务器无关紧要。

gpg --keyserver pgp.mit.edu --refresh-keys

GPG 会列出它检查的密钥以及是否有任何更改和更新。

隐私的重要性

在这个信息时代,隐私是一个日益重要的问题。无论出于何种原因需要保护您的信息安全,GPG 都为您提供了一个简单而强大的工具,可以保护您的文件和通信安全。

除了上述用法之外,GPG 还可以与其他工具集成。例如,您可以使用 Thunderbird 的插件 Enigmail 来加密电子邮件。