GPG 在通信中的简单理解¶
+----------------+ +----------------+
| Alice生成密钥对 | | Bob生成密钥对 |
| 公钥A | 私钥A | | 公钥B | 私钥B |
+-------+--------+ +-------+--------+
| 交换公钥 | |
+--------->+<------------------+
|
+------------------|-------------------+
| 加密阶段: | 解密阶段: |
| Alice用公钥B加密 → 密文 → Bob用私钥B解密 |
+------------------|-------------------+
| 签名阶段: | 验证阶段: |
| Alice用私钥A签名 → 签名 → Bob用公钥A验证 |
+--------------------------------------+
核心概念¶
非对称加密体系:
- 公钥(Public Key):可公开分发的加密钥匙
- 私钥(Private Key):必须严格保密的解密钥匙
- 数学关系:公钥由私钥推导得出,但无法逆向反推
数字签名三要素:
- 身份认证(Authentication) - 确认消息来源
- 完整性验证(Integrity) - 确保内容未被篡改
- 不可否认性(Non-repudiation) - 发送方无法否认发送行为
密钥管理流程¶
# 生成密钥对(4096位 RSA)
gpg --full-generate-key
# 导出公钥
gpg --armor --export alice@example.com > alice_pubkey.asc
# 导入他人公钥
gpg --import bob_pubkey.asc
# 查看密钥列表
gpg --list-keys
完整通信流程(Alice → Bob)¶
准备阶段¶
- 双方生成密钥对
- 交换公钥(通过密钥服务器/邮件/当面交换)
- 互相签名验证公钥真实性
加密阶段¶
-
Alice 撰写原始消息
message.txt
-
使用 Bob 的公钥加密:
gpg --encrypt --recipient bob@example.com message.txt
- 生成数字签名:
gpg --sign --detach-sig message.txt.gpg
解密验证阶段¶
-
Bob 接收加密文件
message.txt.gpg
和签名文件message.sig
-
验证签名:
gpg --verify message.sig message.txt.gpg
- 解密文件:
gpg --decrypt message.txt.gpg > decrypted_message.txt
安全机制解析¶
步骤 | 使用密钥 | 数学运算 | 安全目标 |
---|---|---|---|
消息加密 | Bob 的公钥 | RSA 加密 | 机密性 |
生成哈希值 | SHA-256 | 哈希计算 | 完整性校验 |
签名加密 | Alice 的私钥 | RSA 加密 | 身份认证/不可否认性 |
签名验证 | Alice 的公钥 | RSA 解密 | 验证来源 |
消息解密 | Bob 的私钥 | RSA 解密 | 获取明文 |
典型应用场景¶
- 安全电子邮件(Thunderbird + Enigmail)
- 软件包签名验证(Linux 软件源)
- Git commit 签名
- 加密文件存储
- SSH 认证(GPG 作为 SSH 密钥)
常见问题解答¶
Q:私钥泄露怎么办?
A:立即吊销密钥并重新生成:
gpg --gen-revoke [key-id]
Q:如何验证公钥真实性?
A:通过指纹校验(16位短指纹更易验证):
gpg --fingerprint bob@example.com
Q:为什么需要交叉签名?
A:建立信任链,推荐做法:
- 当面交换密钥指纹
- 参加密钥签名聚会(Key Signing Party)
- 使用 Web of Trust 信任网络
Q:GPG 与对称加密的区别?
A:对比表
特性 | GPG(非对称) | AES(对称) |
---|---|---|
密钥数量 | 密钥对(2个) | 单一密钥 |
加密速度 | 慢(适合小数据) | 快(适合大数据) |
密钥交换 | 无需安全通道 | 需要安全通道 |
典型用途 | 数字签名/密钥交换 | 文件加密 |