GPG 加密和签名

安装 GPG

下载并安装 GPG,在命令提示符运行以下命令查看版本,返回版本信息则说明安装成功。

1
gpg --version

生成密钥对

在使用 GPG 加密和签名之前,先执行以下命令生成密钥对。

1
gpg --full-generate-key

接着就是一些选项:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
C:\Users\ROG>gpg --full-generate-key
gpg (GnuPG) 2.3.3; Copyright (C) 2021 g10 Code GmbH
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Please select what kind of key you want:
(1) RSA and RSA
(2) DSA and Elgamal
(3) DSA (sign only)
(4) RSA (sign only)
(9) ECC (sign and encrypt) *default*
(10) ECC (sign only)
(14) Existing key from card
Your selection? 9
Please select which elliptic curve you want:
(1) Curve 25519 *default*
(4) NIST P-384
(6) Brainpool P-256
Your selection? 1
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

还有输入 Real nameEmail addressComment 和口令。

生成撤销证书

撤销证书只能在密钥可用时生成,所以生成密钥对后,应该为其生成一份撤销证书,以备在某些情况下撤销密钥。

1
gpg --generate-revocation "YourName"

加密和解密文件

使用公钥加密 data.zip 文件,并将其输出为 data.zip.gpg 保存。其中 --recipient 参数用于指定接收者的 USER-ID,不过输入 USER-ID 有点儿麻烦,使用生成密钥对时输入的 Real name 简单多了。

1
gpg --recipient "YourName" --output "data.zip.gpg" --encrypt "data.zip"

解密文件:

1
gpg --output "data.zip" --decrypt "data.zip.gpg"

签名和验证文件

明文签名:
明文签名在平时可能会很少用到,但的确有这样的时候,我们需要让他人知道某个消息就是我们发的。此时,可以将要发送的内容放到 message.txt 文件中,再执行以下命令为 message.txt 签名(由于签名用的是私钥,需要输入口令),签名后会生成 message.asc 签名文件,此文件包含了发送内容与签名,将文件或复制文件中的内容发送给收件人,对方收到后就可以进行验证了。

1
gpg --local-user "YourName" --clear-sign "message.txt"

作为收件人则要导入发件人的公钥,执行以下命令验证签名,如果收到的不是文件,则先将其保存为文本文件后再进行验证。

1
gpg --verify "message.asc"

独立签名:
要对 Zip 这类二进制文件签名时,不能将签名附加到文件中,而需要使用 --detach-sign 参数生成独立的签名文件。

1
gpg --local-user "YourName" --output "data.zip.sig" --detach-sign "data.zip"

这种签名方式在验证时,请将 data.zipdata.zip.sig 文件放在同一位置并执行以下命令:

1
gpg --verify "data.zip.sig"

同时进行加密和签名

如果既加密又要签名,可以使用以下命令:

1
gpg --local-user "YourName" --recipient "YourName" --output "data.zip.gpg" --sign --encrypt "data.zip"

在解密文件时,GPG 会自动验证签名。

1
gpg --output "data.zip" --decrypt "data.zip.gpg"

导出密钥

导出公钥:

1
gpg --output "pubring.gpg" --export "YourName"

导出私钥:

1
gpg --output "secring.gpg" --export-secret-keys "YourName"

C:\Users\ROG\AppData\Roaming\gnupg\trustdb.gpg 和导出的 pubring.gpgsecring.gpg 进行保存。

导入密钥

导入公钥:

1
gpg --import "pubring.gpg"

导入私钥:

1
gpg --import "secring.gpg"

然后复制 trustdb.gpg 到对应的位置。