GPG 是一款强大的开源加密工具,基于公钥密码学原理,为电子通信提供隐私保护和数据验证。它广泛应用于确保信息安全和身份认证。

安装指南

Linux 系统

Debian/Ubuntu:

1
2
sudo apt update
sudo apt install gnupg

CentOS/RHEL:

1
sudo yum install gnupg

Fedora:

1
sudo dnf install gnupg

Arch Linux:

1
sudo pacman -S gnupg

macOS

使用 Homebrew 安装:

1
brew install gnupg

Windows

    1. Gpg4win 官方网站 下载安装包 2. 运行安装程序,按提示完成安装 3. 安装后,在命令提示符或 PowerShell 中验证

FreeBSD

通过 pkg 包管理器安装:

1
pkg install gnupg

验证安装

在任何平台上,运行以下命令确认安装成功:

1
gpg --version

如果显示版本信息和支持的加密算法,则表示安装成功。

密钥管理

生成密钥对

首先需要生成自己的公钥和私钥(如果尚未生成)。

1
2
3
bash
复制代码
gpg --full-generate-key
  • 按提示选择:
    1. 密钥类型:选择 (1) RSA and RSA。
    2. 密钥长度:一般选择 20484096
    3. 密钥有效期:设置为 0(永不过期)或指定期限。
    4. 输入姓名和电子邮件:用于标识密钥。
    5. 设置密码:保护私钥安全。

查看密钥

列出所有公钥:

1
gpg --list-keys

列出所有私钥:

1
gpg --list-secret-keys

这些命令将显示你系统中的所有公钥和私钥,包括密钥 ID、用户 ID 和创建日期等信息。

导入私钥或者公钥

1
2
gpg --import privatekey.asc
gpg --import publickey.asc

导入他人的公钥时会包括与该公钥关联的用户名和邮箱地址。这些信息是公钥的一部分,用于识别公钥的所有者。

导出公钥

要与他人共享你的公钥,可以导出它:

1
gpg --export --armor your_email@example.com(或者uid) > public_key.asc

这将创建一个名为 public_key.asc 的 ASCII 格式文件,包含你的公钥。 --armor 选项将输出转换为 ASCII 编码的“装甲格式”(Armored format)。没有这个选项,默认是二进制。.asc 是一种文件扩展名,表示文件以 ASCII 装甲格式(ASCII Armored Format) 存储的数据。它通常用于 GPG 加密或签名的密钥、签名或加密文件

导出私钥

1
gpg --export-secret-keys --armor <your_email> > privatekey.asc

删除私钥或者公钥

删除公钥:

1
gpg --delete-keys <key_id>

删除私钥:

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

验证公钥指纹

通过哈希算法计算公钥的唯一标识符,验证密钥的真实性和来源。

1
2
3
4
5
$ gpg --fingerprint <key_id>
pub rsa4096 2022-01-01 [SC]
A1B2 C3D4 E5F6 1234 5678 90AB CDEF 1234 5678 9ABC
uid [ultimate] Alice <alice@example.com>
sub rsa4096 2022-01-01 [E]

加密和解密

加密文件

使用接收方的公钥加密文件。例如,将文件 example.txt 加密为 example.txt.gpg:

1
gpg --output example.txt.gpg --encrypt --recipient <recipient_email> example.txt

gpg 使用混合加密,在混合加密过程中,gpg 会自动生成一个随机的、一次性的对称密钥。

加密过程:gpg 用生成的对称密钥加密文件内容,然后用接收方的公钥对该对称密钥进行加密,并将其存储在最终输出文件中。

解密过程:先用自己的私钥解密文件中存储的对称密钥。再用解密出的对称密钥解密文件内容。

所以说可以直接加密大文件。如果文件特别大,可以使用 split 先把文件分割,再每块加密。

加密文件夹:GPG 不直接支持加密整个文件夹,但您可以先将文件夹压缩,然后加密压缩文件:

1
2
tar -czf folder.tar.gz folder/
gpg --output folder.tar.gz.gpg --encrypt --recipient <recipient_email> folder.tar.gz

如果有多个接收方,就多个 --recipient <recipient_email> 即可。他们每人都能解密。

解密文件

接收方使用私钥解密加密文件。例如,将 example.txt.gpg 解密为原文件:

1
gpg --output example.txt --decrypt example.txt.gpg

签名

嵌入签名文件

发送文件时,可以添加数字签名,以验证发送者身份和文件完整性。签名文件是二进制格式,包含签名和文件内容。生成一个嵌入签名文件(Attached Signature), 签名数据与文件内容绑定在一起,输出的文件既包含原始文件内容,又包含签名。

1
gpg --output example.txt.sig --sign example.txt

验证和分离的方法:

1
gpg --output example.txt --decrypt example.txt.sig

分离签名文件

签名独立存储在一个单独的 .sig 文件中,原始文件 file.txt 不会被修改。通常用于需要保持原始文件完整性、不想嵌入签名的场景(如软件分发)。

1
gpg --output file.sig --detach-sign file.txt

验证方法:

1
gpg --verify file.sig file.txt

加密并签名文件

用自己的私钥签名,对方的公钥加密。

1
gpg --output encrypted_signed_file.gpg --encrypt --sign --recipient <recipient_email> file.txt

解密流程和普通的解密是完全一致的。

查看文件是否带有签名

1
gpg --list-packets file.gpg

对称加密(无需公钥,简单加密)

加密:

1
gpg --output example.txt.gpg --symmetric example.txt

解密

1
gpg --output example.txt --decrypt example.txt.gpg

在解密时,gpg 会自动检测文件的加密类型。它会查看加密文件的头部信息,其中包含了使用的加密方法(对称或非对称)。这种设计使得 gpg 可以灵活地处理不同类型的加密文件,而无需用户明确指定加密类型。