PGP (Pretty Good Privacy) 是由 Phil Zimmermann 于 1991 开发的一个用于数据加密和数字签名的程序,由于被广泛应用以至于后来形成一个开放的标准 OpenPGP,而 GnuPG 则是实现了该标准的一个开源免费程序。

安装 GnuPG

linux

1
apt-get install gnupg

window
下载地址:https://www.gpg4win.org/

常见命令

生成密钥

生成钥匙对

1
gpg --gen-key

这时,最好再生成一张”撤销证书”,以备以后密钥作废时,可以请求外部的公钥服务器撤销你的公钥。

1
gpg --gen-revoke [用户ID]

密钥管理

列出密钥

list-keys参数列出系统中已有的密钥.

1
gpg --list-keys

显示结果如下:

1
2
3
4
5
6
/home/ye1s/.gnupg/pubring.kbx
-----------------------------
pub rsa3072 2020-08-11 [SC] [expires: 2022-08-11]
579144D23E096A7A7D21AA6784D928644A29F13F
uid [ultimate] ye1sec <431774437@qq.com>
sub rsa3072 2020-08-11 [E] [expires: 2022-08-11]

579144D23E096A7A7D21AA6784D928644A29F13F 是这个公钥的id,ye1sec是这个公钥的uid,这个id跟uid都是用于标识这个公钥的,因为uid是用户随便输入的所以会有重复的情况,因此在某些需要明确指定公钥的命令,需要用id而不能用uid表示这个公钥。
如果你要从密钥列表中删除某个密钥,可以使用delete-key参数。

1
gpg --delete-key [用户ID]

输出密钥

公钥文件(.gnupg/pubring.gpg)以二进制形式储存,armor参数可以将其转换为ASCII码显示。

1
gpg --armor --output public-key.txt --export [用户ID]

“用户ID”指定哪个用户的公钥,output参数指定输出文件名(public-key.txt)。

类似地,export-secret-keys参数可以转换私钥。

1
gpg --armor --output private-key.txt --export-secret-keys [用户ID]

上传公钥

公钥服务器是网络上专门储存用户公钥的服务器。send-keys参数可以将公钥上传到服务器。

1
gpg --keyserver keys.gnupg.net --send-key ID

使用上面的命令,你的公钥就被传到了服务器subkeys.pgp.net,然后通过交换机制,所有的公钥服务器最终都会包含你的公钥。
由于公钥服务器没有检查机制,任何人都可以用你的名义上传公钥,所以没有办法保证服务器上的公钥的可靠性。通常,你可以在网站上公布一个公钥指纹,让其他人核对下载到的公钥是否为真。fingerprint参数生成公钥指纹。

1
gpg --fingerprint [用户ID]

输入密钥

除了生成自己的密钥,还需要将他人的公钥或者你的其他密钥输入系统。这时可以使用import参数。

1
gpg --import [密钥文件]

为了获得他人的公钥,可以让对方直接发给你,或者到公钥服务器上寻找。

1
gpg --keyserver hkp://subkeys.pgp.net --search-keys [用户ID]

正如前面提到的,我们无法保证服务器上的公钥是否可靠,下载后还需要用其他机制验证.

删除密钥

必须先删除私钥,然后才能删除公钥。
在命令行输入如下命令:

1
2
gpg --delete-secret-keys  uid
gpg --delete-keys uid

修改密钥

1
gpg --edit-key

加密和解密

加密

假定有一个文本文件demo.txt,怎样对它加密呢?

encrypt参数用于加密。

1
gpg --recipient [用户ID] --output demo.en.txt --encrypt demo.txt

recipient参数指定接收者的公钥,output参数指定加密后的文件名,encrypt参数指定源文件。运行上面的命令后,demo.en.txt就是已加密的文件,可以把它发给对方。

解密

对方收到加密文件以后,就用自己的私钥解密。

1
gpg --decrypt demo.en.txt --output demo.de.txt

decrypt参数指定需要解密的文件,output参数指定解密后生成的文件。运行上面的命令,demo.de.txt就是解密后的文件。

GPG允许省略decrypt参数。

1
gpg demo.en.txt

运行上面的命令以后,解密后的文件内容直接显示在标准输出。

签名

对文件签名

有时,我们不需要加密文件,只需要对文件签名,表示这个文件确实是我本人发出的。sign参数用来签名。

1
gpg --sign demo.txt

运行上面的命令后,当前目录下生成demo.txt.gpg文件,这就是签名后的文件。这个文件默认采用二进制储存,如果想生成ASCII码的签名文件,可以使用clearsign参数。

1
gpg --clearsign demo.txt

运行上面的命令后 ,当前目录下生成demo.txt.asc文件,后缀名asc表示该文件是ASCII码形式的。

如果想生成单独的签名文件,与文件内容分开存放,可以使用detach-sign参数。

1
gpg --detach-sign demo.txt

运行上面的命令后,当前目录下生成一个单独的签名文件demo.txt.sig。该文件是二进制形式的,如果想采用ASCII码形式,要加上armor参数。

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

签名+加密

上一节的参数,都是只签名不加密。如果想同时签名和加密,可以使用下面的命令。

1
gpg --local-user [发信者ID] --recipient [接收者ID] --armor --sign --encrypt demo.txt

local-user参数指定用发信者的私钥签名,recipient参数指定用接收者的公钥加密,armor参数表示采用ASCII码形式显示,sign参数表示需要签名,encrypt参数表示指定源文件。

验证签名

我们收到别人签名后的文件,需要用对方的公钥验证签名是否为真。verify参数用来验证。

1
gpg --verify demo.txt.asc demo.txt

参考文章:
GPG入门教程