GPG 简单入门

本文操作环境为 Arch Linux, 在 Windows 下可以用 GUI 程序 Kleopatra 进行类似的操作。

首先我们来介绍一下 GPG , gpg 是一个密钥对,分为公钥和私钥。公钥用来加密和验证签名,私钥用来签名和解密。

当然还有其他的操作可以使用,比如利用 GPG 密钥来登陆 ssh ,但是这里就不先表述了。

而关于公私钥的使用,可以参考如下的图。

publik key krypto

如名字所述,公钥用来公开给其他人,然后私钥自己保留,绝对不要把私钥发送给别人。

生成

可参见 这篇部落格

导出密钥

密钥文件很重要,如果你需要备份密钥文件,请使用 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 。