GnuPG(PGP)简易入门教程:一步一步教你使用PGP

PGP简介:

Pretty Good Privacy ( PGP ) 是一個加密程序,它為資料通訊提供加密 隱私和身份驗證。 PGP 用於簽署、加密和解密文字、電子郵件、檔案、目錄和整個磁碟分割區,並提高電子郵件通訊的安全性。 Phil Zimmermann於1991年開發了 PGP 。

PGP签名与验证原理:

签名/验证签名过程

PGP加密与解密原理:

签名/验证过程

安装PGP

注:以下内容在 debian12 下验证,使用的 pgp 版本 2.2.27。

debian安装gpg:

apt install gpg

检查当前gpg版本信息:

gpg --version

操作PGP

列出所有 GPG 密钥: 通过以下命令查看所有已导入的 GPG 密钥:

gpg --list-keys

删除私钥:找到要删除的私钥的 ID,然后运行以下命令:

gpg --delete-secret-key <key_id>

删除公钥: 找到要删除的公钥的 ID,然后运行以下命令:

gpg --delete-key <key_id>

uid 可以是 name,可以是邮箱,可以是公钥指纹,只要不重复就可以用。

新建PGP密钥对

选择 GPG 密钥

$gpg(or gpg2) --expert --full-gen-key

–expert:提供高级选项,允许用户自定义密钥参数。

–full-gen-key:创建一个完整的新密钥,而不是默认的简单模式。

选择PGP密钥类型

Please select what kind of key you want:

    (1) RSA and RSA (default)
    (2) DSA and Elgamal
    (3) DSA (sign only)
    (4) RSA (sign only)
    (7) DSA (set your own capabilities)
    (8) RSA (set your own capabilities)
    (9) ECC and ECC
    (10) ECC (sign only)
    (11) ECC (set your own capabilities)
    (13) Existing key
    (14) Existing key from card

选择 9:生成 ECC(椭圆曲线密码学)密钥对。

Your selection? 9

选择椭圆曲线类型

    Please select which elliptic curve you want:
    (1) Curve 25519
    (3) NIST P-256
    (4) NIST P-384
    (5) NIST P-521
    (6) Brainpool P-256
    (7) Brainpool P-384
    (8) Brainpool P-512
    (9) secp256k1

GPG 提供了多种 ECC 曲线:

Curve 25519:现代安全曲线,推荐使用。

NIST P-256 / P-384 / P-521:由 NIST 标准化,广泛应用,但可能受 NSA 影响。

Brainpool P-256 / P-384 / P-512:欧洲标准,避免使用 NIST 曲线。

secp256k1:比特币使用的曲线。

Your selection?8

设置私钥的有效期

Please specify how long the key should be valid.
     0 = key does not expire
  <n>  = key expires in n days
  <n>w = key expires in n weeks
  <n>m = key expires in n months
  <n>y = key expires in n years
Key is valid for? (0) 0

Key does not expire at all
Is this correct? (y/N) y

GnuPG needs to construct a user ID to identify your key.

创建用户ID

Real name: tiger
Email address: tiger@prog.ws
Comment: tiger
You selected this USER-ID:
    "tiger (tiger) <tiger@prog.ws>"

Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? O

PGP密钥用户信息允许随便填写。

设置私钥密码

请牢记,密码是密码,私钥是私钥,密码保护私钥,私钥在,密码可以重设,私钥是核心。操作PGP加密签名需要验证私钥密码。导出私钥需要验证私钥密码,导入私钥需要设置私钥密码。私钥安全备份后,私钥密码允许忘记,但私钥不能遗失,否则将无法解密数据或签名身份。

按照PGP系统引导提示为私钥设置密码保护。

生成PGP密钥对

generator a better chance to gain enough entropy.

GPG 需要收集随机熵(entropy)来生成安全密钥。

用户可以移动鼠标、按键、运行进程等来增加熵。

生成的公钥被标记为“最终信任”(ultimately trusted)。

gpg: key 0x0 marked as ultimately trusted

撤销证书已存储,可以在私钥泄露或废弃时用于撤销公钥。

gpg: revocation certificate stored as '/home/user/.gnupg/openpgp-revocs.d/250C...E3.rev'
public and secret key created and signed.

列出PGP密钥信息

pub   brainpoolP512r1/0x6DF6A5A0C8B863E3 2025-03-19 [SC]
    B4F1303141E3F7D942C5368447518F459925DC9A
uid        tiger (tiger) <tiger@prog.ws>
sub   brainpoolP512r1/0x1HRTDHRHRRJR 2025-03-19 [E]

公钥指紋

公鑰指紋是公鑰的縮短版本。

透過指紋,某人可以驗證正確對應的公鑰。

諸如B4F1303141E3F7D942C5368447518F459925DC9A
之類的指紋可以列印在名片上。

导出 GPG 公钥 并以 ASCII 格式保存到指定文件中

gpg --armor --output /home/user/Desktop/gpg-public-key.txt --export tiger@prog.ws

–armor:以 ASCII(文本)格式导出,而不是二进制格式。这样导出的公钥更易于存储和共享。

–output /home/user/Desktop/gpg-public-key.txt:
指定输出文件路径,将公钥保存到 桌面 的 gpg-public-key.txt 文件。

–export tiger@:
导出匹配 tiger@ 的公钥(可模糊匹配完整的 tiger@prog.ws)。

公钥允许随便给人看,但是私钥绝对不能。

导出 GPG 私钥 并以 ASCII 格式保存到指定文件中

gpg --armor --output PGP-private-key.txt --export-secret-keys [uid]

私钥必须离线安全备份,绝对不能泄露到公网,比如网盘,收藏夹之类的,一定切记。

将公钥托管在密钥服务器

上传公钥

gpg --keyserver hkps://keys.openpgp.org --send-keys [Key ID]

搜索公钥

gpg --search-keys [uid]

下载公钥

gpg --receive-keys [uid]

默认的密钥服务是 keys.gnupg.net, 可通过参数–keyserver [key server url]指定密钥服务器。

常见的密钥服务器有(维基):

https://keyserver.ubuntu.com

https://pgp.mit.edu

https://keyring.debian.org

导入公钥并标记可信

--import 指定导入公钥所在文件
gpg --import ./public-key.txt

用于对 GPG 密钥进行签名,表示你信任该用户的公钥。

[uid] 导入公钥的 uid
gpg --sign-key [uid]

使用gpg签名数据

可通过 –output 参数指定输出前面文件位置

生成签名文件(默认签名)| 二进制格式

在当前目录生成 demo.txt.gpg 文件,文件是二进制格式,含有原始文件内容和签名信息

gpg --sign demo.txt

嵌入式签名(Clearsign)| 文本格式

会在当前目录生成 demo.txt.asc 文件,文件是文本格式,含有原始文件内容和签名信息

gpg --clearsign demo.txt

独立签名(Detached Signature)| 二进制格式

会在当前目录生成 demo.txt.sig 文件,文件是二进制格式,仅含有签名信息

gpg --detach-sign demo.txt

独立签名(Detached Signature)| 文本格式

会在当前目录生成 demo.txt.sig 文件,文件是文本格式,仅含有签名信息

gpg --armor --detach-sign demo.txt

验证签名

不同类型的签名文件,验证签名的方法也有所不同。以下是各种签名类型的验证方法:

操作类型 验证命令 说明
默认签名(demo.txt.gpg gpg --verify demo.txt.gpg 验证二进制签名文件,自动提取签名内容和原始文件
嵌入式签名(demo.txt.asc gpg --verify demo.txt.asc 验证文本格式的嵌入式签名文件,包含内容和签名
独立签名(二进制格式,demo.txt.sig gpg --verify demo.txt.sig demo.txt 验证二进制签名,提供原始文件 demo.txt
独立签名(文本格式,demo.txt.sig gpg --verify demo.txt.sig demo.txt 验证文本格式签名,提供原始文件 demo.txt

使用gpg加密数据

加密文件, –recipient 指定接收方的 UID 或者公钥

gpg --output demo.enc.txt --recipient [uid] --encrypy demo.txt

–recipient [uid]:指定接收方的 UID 或者公钥,用于加密文件。

–encrypt:加密操作。

–output demo.enc.txt:指定输出加密后的文件名。

解密文件, 不需要指定密钥,密文中已经包含了加密所用的公钥信息。

gpg --output demo.de.txt --decrypt demo.enc.txt

解密加密文件 demo.enc.txt,并将解密后的内容保存为 demo.de.txt。

注意:不需要指定密钥,因为密文中已经包含了加密所用的公钥信息。解密时会自动使用与公钥对应的私钥进行解密。

参考资料:

https://en.wikipedia.org/wiki/Pretty_Good_Privacy

https://github.com/isayme/blog/issues/68

dark
sans