0%

gpg笔记

学习使用gpg。

生成密钥

1
gpg --full-generate-key

如果生成密钥的时候出现以下错误

1
2
gpg: agent_genkey failed: No such file or directory
Key generation failed: No such file or directory

执行以下命令,解决。

1
gpgconf --kill gpg-agent

创建子密钥

1
gpg --edit-key <user-id>

备份密钥

1
gpg -o gpg_key --export-options backup --export-secret-keys <user-id>

会生成一个gpg_key文件,--export-options backup参数表示导出恢复gpg密钥所需的所有数据,如果有设置密钥口令,还要输入密钥才能导出。导出后,建议放在某个安全的地方保存起来。

备份子密钥

1
gpg -o gpg_sub_key --export-secret-subkeys <user-id>

为了安全,我们应该只使用子密钥来进行加密和签名,而主密钥我们应该将其保存在一个安全的地方。

删除密钥

1
2
gpg --delete-secret-keys <user-id> #删除指定的私钥
gpg --delete-keys <user-id> #删除指定的公钥

删除主密钥后,记得要清理生成的吊销证书

1
rm ~/.gnupg/openpgp-revocs.d/KEYID.rev

恢复密钥

1
2
3
gpg --import-options restore --import gpg_key

gpg --edit-key <user-id> trust quit #因为是导入的,所以要设置信任状态

列出密钥

1
2
3
4
gpg --list-keys #列出所有
gpg --list-public-keys #列出公钥
gpg --list-secure-keys #列出私钥
gpg --list-signatures #列出签名

导出公钥

1
2
3
4
5
6
7
gpg --output public.key --armor --export <user-id>

gpg --send-keys <key-id> #将公钥注册到公钥服务器

gpg --keyserver --send-keys <key-id> #将公钥注册到指定公钥服务器

gpg --fingerprint [user-id] #生成验证指纹

导入公钥

1
2
3
4
5
6
7
gpg --import public.key # 导入他人的公钥

gpg --recv-keys <key-id> #在公钥服务器上导入他人的公钥

gpg --search-keys <key-id> #搜索公钥

gpg --keyserver hkb://a.pgp.net --search-keys <user-id>#指定公钥服务器搜索

Warning: 任何人都可以将公钥注册到密钥服务器上,因此不应该完全信任从密钥服务器上所检索到的某人的公钥。你应该通过将你检索到的公钥的指纹与该公钥所有者在可信任的来源(如该公钥所有者的博客或网站)所发布的指纹进行比较,或是直接通过电话或邮件联系该公钥所有者进行确认,以确保你检索到的公钥的真实性。使用多种方式进行验证可以提高你所检索到的公钥的可信度。更多相关信息,请参见Wikipedia:Public key fingerprint.

加密与解密

公钥加密,私钥解密

1
2
gpg -r <user-id> -e <file-name> #使用指定userid的公钥加密文件。
gpg -r <user-id> -d <file-name> #使用指定userid的私钥来解密文件。

比如,你需要发一个保存密码的文件给张三,那你就可以用张三的发布在公钥服务器上的公钥来加密。

1
2
gpg --recv-keys 张三keyid
gpg -r 张三 -e password.txt

之后会生成一个password.txt.gpg文件,你把这个加密过的文件发给张三。张三可以这样解密。

1
gpg -r 张三 -d password.txt.gpg

然后就会要求输入只有张三知道的私钥口令。输入正确后解密完成。如果私钥泄露,那么就要吊销整个密钥。

签名

1
2
3
4
5
6
7
8
9
10
gpg --sign a.txt #执行后会生成a.txt.gpg,二进制存储。
gpg --clearsign a.txt #以ascii码存储。生成a.txt.asc
gpg --detach-sign a.txt #单独生成签名文件,输出a.txt.sig
gpg --armor --detach-sith a.txt #以ascii码生成一个单独的签名文件输出a.txt.asc

##同时加密和签名
gpg -u [user-id] -r [user-id] -a -s -e a.txt #-u 是--local-user的缩写,指定发信者的私钥签名,-r 是 --recipient的缩写,指定接收者的公钥加密,-a 是 --armor的缩写,表示用ascii码形式显示,-s 是 --sign的缩写,表示需要签名,-e 是--encrypt的缩写,指定源文件。

##验证签名
gpg --verify a.txt.asc a.txt

参考