GPG 简单入门
本文操作环境为 Arch Linux, 在 Windows 下可以用 GUI 程序 Kleopatra 进行类似的操作。
首先我们来介绍一下 GPG , gpg 是一个密钥对,分为公钥和私钥。公钥用来加密和验证签名,私钥用来签名和解密。
当然还有其他的操作可以使用,比如利用 GPG 密钥来登陆 ssh ,但是这里就不先表述了。
而关于公私钥的使用,可以参考如下的图。
如名字所述,公钥用来公开给其他人,然后私钥自己保留,绝对不要把私钥发送给别人。
生成
可参见 这篇部落格
导出密钥
密钥文件很重要,如果你需要备份密钥文件,请使用 gpg -a --export-secret-keys <KEY_ID>
$ gpg -a --export-secret-keys 0000000000000000
-----BEGIN PGP PRIVATE KEY BLOCK-----
...
-----END PGP PRIVATE KEY BLOCK-----
-a
的参数,在下文加密中有叙述。
当然,你如果要把你的公钥给其他人,请使用 gpg -a --export <KEY_ID>
$ gpg -a --export 0000000000000000
-----BEGIN PGP PUBLIC KEY BLOCK-----
...
-----END PGP PUBLIC KEY BLOCK-----
把输出的一大串东西统统发给其他人就行了。
导入公钥
首先你需要取得对方的公钥文件,它一般情况下是这个格式。
-----BEGIN PGP PUBLIC KEY BLOCK-----
...
-----END PGP PUBLIC KEY BLOCK-----
加密
可以加密任何文件,或者文本。前置条件是你有你需要加密的人的公钥。
输入 gpg -ae
根据提示操作即可。
$ gpg -ae
You did not specify a user ID. (you may use "-r")
Current recipients:
Enter the user ID. End with an empty line: [email protected]
Current recipients:
cv25519/0000000000000000 1145-01-04 "Test <[email protected]>"
Enter the user ID. End with an empty line:
233
-----BEGIN PGP MESSAGE-----
hF4D/00000000000000000000000000000000000000000000000000000000RQw
uG00000000000000/00000000000000000000000000000000000000000000tGq
000000000000000000000000000000000000000000000000000000000000000q
a/000000000000000000008=
=0007
-----END PGP MESSAGE-----
-a
参数用来输出非二进制,在控制台使用的情况下,输出二进制可能不是用户所想要的功能。而使用这个方式加密完文本之后,会有相对比较清楚的显示所以可以直接复制。
而 -e
参数用来告诉 GPG 进入加密模式。
注意:如果你加密了信息,但是你没有把你自己的 id 放到 recipients 中的话,你自己是无法解密你加密的这条讯息的。
签名
$ gpg -sa
test
-----BEGIN PGP MESSAGE-----
00000000000000000000000000000000000000000000000000000000000000nq
/000000000000000000000000000000000000000000000000000/+000000000x
00000000000000000000000000000000000000000000000000000000000000==
=vd3U
-----END PGP MESSAGE-----
-s
参数告诉 GPG 进入签名模式。
当然如果你只是想签名,而想让其他人直接看到被签名的消息,可以使用 gpg --clear-sign
。
$ gpg --clear-sign
test
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA512
test
-----BEGIN PGP SIGNATURE-----
000000000000000000000000000000000000000000000000000000000+000000
000000000000000000000000000000+000000000000000000000000000000000
0000000000000000000000000000000=
=kaxV
-----END PGP SIGNATURE-----
这样你签名的文字就会直接显示在文字中。
当然,你如果需要在加密时附上你的签名,只要把 -s
附加到参数中就行。
解密/验证签名
这两个都可以使用 gpg -d
来完成。
输入后,粘贴上想要解密/验证的文本。 gpg 会自动帮你处理。
解密
$ gpg -d
-----BEGIN PGP MESSAGE-----
0000/00000000000000000000000000000000000000000000000000000/00000
0000000000000000000+000/00000000000/000000000000000000000000000/
0000000000000000000000000000000000000000000000000000000000000000
00000000000000000+00+00=
=25q7
-----END PGP MESSAGE-----
gpg: encrypted with 255-bit ECDH key, ID 0000000000000000, created 1145-01-04
"Test <[email protected]>"
test
验证签名
$ gpg -d
-----BEGIN PGP MESSAGE-----
00000000000000000000000000000000000000000000000000000000000000nq
/000000000000000000000000000000000000000000000000000/+000000000x
00000000000000000000000000000000000000000000000000000000000000==
=vd3U
-----END PGP MESSAGE-----
test
gpg: Signature made Thu 04 Jan 1145 19:19:08 CST
gpg: using EDDSA key 0000000000000000000000000000000000000000
gpg: Good signature from "Test <[email protected]>" [ultimate]
gpg: aka "Test <[email protected]>" [ultimate]
信任
GPG 容易受到中间人攻击,请利用其他的方式确保你获得的 key 是对方实际正在使用的 key 。