GnuPG(GNU Privacy Guard,GPG)是一种加密软件,它是PGP加密软件的开源替代物。GnuPG依照由IETF制定的OpenPGP技术标准设计。GnuPG是用于加密、数字签章及产生非对称匙对的软件。GPG兼容PGP(Pretty Good Privacy)的功能。

安装

一般like uinx下会都包含GPG软件包。gpg --version查看是否安装与版本。

同样gpg --help获取命令帮助。

生成密钥

1
# 生成新的密钥对
2
gpg --gen-key
3
gpg --generate-key
4
5
## 更多密钥配置选项生成新的密钥对
6
gpg --full-generate-key
7
gpg --full-gen-key

生成密钥时,会要求做一些随机的举动(敲打键盘、移动鼠标、读写硬盘之类),以生成一个随机数。生成过程需要一段时间。

显示密钥

生成的密钥一般存在与~/.gnupg目录下。可以通过如下命令查看:

1
gpg -k
2
gpg --list-keys
3
# 显示某个用户的密钥信息
4
gpg --list-key [用户id]
5
# 显示私钥信息
6
gpg --list-secret-keys

用户ID

用户ID可以是之前填写的Real name邮箱,或者那行Hash字符串

撤销证书

撤销证书可以用于密钥作废时,请求外部的公钥服务器撤销该公钥。

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

发布公钥

输出密钥

公钥文件(.gnupg/pubring.gpg)是二进制形式保存的,可以将其导出成ASCII码形式的文件。

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

上传公钥

公钥服务器是专门用于储存用户公钥的服务器。send-keys可以将公钥上传到指定的公钥服务器,供其它用户进行加解密处理。

1
gpg --keyserver hkp://subkeys.pgp.net --send-keys [用户ID]
2
#hkp://hkps.pool.sks-keyservers.net
3
#hkp://keyserver.ubuntu.com

公钥服务器会使用同步机制使网络上的所有公钥服务器最终都会包含你的公钥。公钥服务器没有验证机制,所以任何人都可以上传公钥,无法保证服务器上的公钥完全可靠。一般情况下,分发公钥指纹可以让用户验证公钥是否可靠:

1
gpg --fingerprint [用户ID]

输入密钥

除了生成的密钥,为了验证其它系统分发的消息或者文件,需要导入其它人分发的密钥。这时可以使用import:

1
gpg --import [密钥文件]
2
gpg --import public-key.txt

获取公钥

除了对方直接给与公钥文件,也可以从公钥服务器导入公钥。

1
#查找公钥
2
gpg --keyserver hkp://subkeys.pgp.net --search-keys  [用户ID]
3
4
gpg --keyserver keyring.debian.org --recv-keys xxxxxxxx

这里无法保证服务器上的公钥是否可靠,下载后还需要用其他机制验证。

加解密文件

加密

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

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

解密

1
gpg --decrypt demo.en.txt > demo.de.txt
2
# 省略版本会把内容单纯显示与标准输出
3
gpg demo.en.txt

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

文件签名与验签

签名

sign参数用来签名,表示文件确实有我本人发出的。运行该命令后,会在当前目录下生成demo.txt.gpg文件,即签名后的文件。该文件默认采用二进制储存,如果想生成ASCII码的签名文件,可以使用clearsign参数,生成demo.txt.asc文件,后缀名asc表示该文件是ASCII码形式的。

1
gpg --sign demo.txt
2
gpg --clearsign demo.txt

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

如果想采用ASCII码形式,在detach-sign基础上还要加上armor参数。

1
gpg --detach-sign demo.txt
2
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