GPG简单来说是一种加密机制,可以用来加密文件、邮件等。这里以Centos为例记录一下生成密钥以及相关操作。

安装

直接使用yum命令进行安装即可yum install gnupg

生成密钥

首先执行gpg --gen-key

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
gpg (GnuPG) 1.4.21; Copyright (C) 2015 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
gpg: 钥匙环‘/home/xxx/.gnupg/secring.gpg’已建立
请选择您要使用的密钥种类:
(1) RSA and RSA (default)
(2) DSA and Elgamal
(3) DSA (仅用于签名)
(4) RSA (仅用于签名)
您的选择? 1
RSA 密钥长度应在 1024 位与 4096 位之间。
您想要用多大的密钥尺寸?(2048)4096
您所要求的密钥尺寸是 4096 位
请设定这把密钥的有效期限。
0 = 密钥永不过期
<n> = 密钥在 n 天后过期
<n>w = 密钥在 n 周后过期
<n>m = 密钥在 n 月后过期
<n>y = 密钥在 n 年后过期
密钥的有效期限是?(0)
密钥永远不会过期
以上正确吗?(y/n)y

根据自己需要选择相应选项即可,不过这里我遇到一个问题,如果选择密钥长度为2048,最后会报错,错误信息类似:

1
2
3
4
5
6
7
8
9
10
11
gpg: lookup_hashtable failed: eof
gpg: lookup_hashtable failed: eof
gpg: upd_hashtable: read failed: eof
gpg: 信任记录 1,类别 12:写入失败:eof
gpg: Error: The trustdb is corrupted.
gpg: You may try to re-create the trustdb using the commands:
gpg: cd ~/.gnupg
gpg: gpg2 --export-ownertrust > otrust.tmp
gpg: rm trustdb.gpg
gpg: gpg2 --import-ownertrust < otrust.tmp
gpg: If that does not work, please consult the manual

如果使用4096则没问题,原因未知。

接下来按照提示依次输入自己的信息即可:

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
29
30
31
您需要一个用户标识来辨识您的密钥;本软件会用真实姓名、注释和电子邮件地址组合
成用户标识,如下所示:
“Heinrich Heine (Der Dichter) <heinrichh@duesseldorf.de>”
真实姓名:Xxx Xxxx
电子邮件地址:xxxx@xxxx.com
注释:
您选定了这个用户标识:
“Xxx Xxxx <xxxx@xxxx.com>”
更改姓名(N)、注释(C)、电子邮件地址(E)或确定(O)/退出(Q)?O
您需要一个密码来保护您的私钥。
我们需要生成大量的随机字节。这个时候您可以多做些琐事(像是敲打键盘、移动
鼠标、读写硬盘之类的),这会让随机数字发生器有更好的机会获得足够的熵数。
+++++
....+++++
我们需要生成大量的随机字节。这个时候您可以多做些琐事(像是敲打键盘、移动
鼠标、读写硬盘之类的),这会让随机数字发生器有更好的机会获得足够的熵数。
++d+++
.++++a+
sgpg: 密钥 3F95181G 被标记为绝对信任
公钥和私钥已经生成并经签名。
gpg: 正在检查信任度数据库
gpg: 需要 3 份勉强信任和 1 份完全信任,PGP 信任模型
gpg: 深度:0 有效性: 1 已签名: 0 信任度:0-,0q,0n,0m,0f,1u
pub 4096R/3F95181G 2016-09-05
密钥指纹 = 6274 A3B2 CA41 0D5A F22E D1D8 5532 5279 3D8A 4089
uid Xxx Xxxx <xxxx@xxxx.com>
sub 4096R/3A6F870F 2016-09-05

上面的密钥3F95181G就是用户ID。

上传公钥

使用下面的命令把生成的公钥上传到公钥服务器:

1
2
gpg --send-keys 3F95181G
gpg: 将密钥‘3F95181G’上传到 hkp 服务器 keys.gnupg.net

这里,由于任何人都可以用你的名义上传公钥,所以我们可以在网上公布一个公钥指纹,来让别人核对公钥是否为真:

1
gpg --fingerprint [用户ID]

生成”撤销证书”

如果未来某一天,你不想用这个密钥或者密钥泄漏了,可以使用这个来请求公钥服务器撤销公钥:

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
29
30
gpg --gen-revoke 3F95181G
sec 4096R/3F95181G 2016-09-05 Xxx Xxxx <xxxx@xxxx.com>
要为这把密钥建立一份吊销证书吗?(y/N)y
请选择吊销的原因:
0 = 未指定原因
1 = 密钥已泄漏
2 = 密钥被替换
3 = 密钥不再使用
Q = 取消
(也许您会想要在这里选择 1)
您的决定是什么?2
请输入描述(可选);以空白行结束:
>
吊销原因:密钥被替换
(不给定描述)
这样可以吗? (y/N)y
您需要输入密码,才能解开这个用户的私钥:“Xxx Xxxx <xxxx@xxxx.com>”
4096 位的 RSA 密钥,钥匙号 3F95181G,建立于 2016-09-05
已强行使用 ASCII 封装过的输出。
已建立吊销证书。
请把这个文件转移到一个可隐藏起来的介质(如软盘)上;如果坏人能够取得这
份证书的话,那么他就能让您的密钥无法继续使用。把这份凭证打印出来再藏
到安全的地方也是很好的方法,以免您的保存媒体损毁而无法读取。但是千万
小心:您的机器上的打印系统可能会在打印过程中把这些数据临时在某个其他
人也能够看得到的地方!

文件的加密解密

加密的命令如下:

1
gpg --recipient [用户ID] --output 加密后文件名 --encrypt 所需加密文件名

解密:

1
2
3
4
5
6
gpg --output 解密后文件名 --decrypt 已经加密的文件名
您需要输入密码,才能解开这个用户的私钥:“Xxx Xxxx <xxxx@xxxx.com>”
4096 位的 RSA 密钥,钥匙号 3A6F970F,建立于 2016-09-05 (主钥匙号 3F95181G)
请输入密码:

其他

  1. 列出密钥gpg --list-keys
  2. 删除密钥gpg --delete-key [用户ID]
  3. 导出公钥gpg --armor --output public-key.txt --export [用户ID],armor参数可以将其转换为ASCII码显示。
  4. 导出私钥gpg --armor --output private-key.txt --export-secret-keys
  5. 导入密钥gpg --import [密钥文件]
  6. 查看公钥指纹gpg --fingerprint [用户ID]
  7. 搜索他人密钥gpg --search-keys [用户ID]这里需要注意核查密钥是否真实

参考

  1. 阮一峰