安全加密实践-GPG
GPG 是一款强大的开源加密工具,基于公钥密码学原理,为电子通信提供隐私保护和数据验证。它广泛应用于确保信息安全和身份认证。
安装指南
Linux 系统
Debian/Ubuntu:
1 | sudo apt update |
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
-
- 从 Gpg4win 官方网站 下载安装包 2. 运行安装程序,按提示完成安装 3. 安装后,在命令提示符或 PowerShell 中验证
FreeBSD
通过 pkg 包管理器安装:
1 | pkg install gnupg |
验证安装
在任何平台上,运行以下命令确认安装成功:
1 | gpg --version |
如果显示版本信息和支持的加密算法,则表示安装成功。
密钥管理
生成密钥对
首先需要生成自己的公钥和私钥(如果尚未生成)。
1 | bash |
- 按提示选择:
- 密钥类型:选择
(1)
RSA and RSA。 - 密钥长度:一般选择
2048
或4096
。 - 密钥有效期:设置为
0
(永不过期)或指定期限。 - 输入姓名和电子邮件:用于标识密钥。
- 设置密码:保护私钥安全。
- 密钥类型:选择
查看密钥
列出所有公钥:
1 | gpg --list-keys |
列出所有私钥:
1 | gpg --list-secret-keys |
这些命令将显示你系统中的所有公钥和私钥,包括密钥 ID、用户 ID 和创建日期等信息。
导入私钥或者公钥
1 | gpg --import privatekey.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 | $ gpg --fingerprint <key_id> |
加密和解密
加密文件
使用接收方的公钥加密文件。例如,将文件 example.txt 加密为 example.txt.gpg:
1 | gpg --output example.txt.gpg --encrypt --recipient <recipient_email> example.txt |
gpg 使用混合加密,在混合加密过程中,gpg 会自动生成一个随机的、一次性的对称密钥。
加密过程:gpg 用生成的对称密钥加密文件内容,然后用接收方的公钥对该对称密钥进行加密,并将其存储在最终输出文件中。
解密过程:先用自己的私钥解密文件中存储的对称密钥。再用解密出的对称密钥解密文件内容。
所以说可以直接加密大文件。如果文件特别大,可以使用 split
先把文件分割,再每块加密。
加密文件夹:GPG 不直接支持加密整个文件夹,但您可以先将文件夹压缩,然后加密压缩文件:
1 | tar -czf folder.tar.gz folder/ |
如果有多个接收方,就多个 --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 可以灵活地处理不同类型的加密文件,而无需用户明确指定加密类型。