最后更新于 2022 年 5 月 24 日

Featured image of post GPG的使用与创建

GPG的使用与创建

使用GPG密钥进行安全通信

GPG介绍

提到 GPG 不得不提一下 PGP(Pretty Good Privacy) , PGP 最开始是由 Phil Zimmermann 开发,开发的目的是为了躲避监视,如果文件在网络上明文传输,那是多么危险。 PGP 虽然受很多人喜爱,但是是个商业软件,不能自由使用。所以自由基金会决定自己开发一个取名叫 GPG ,这就是 GPG 的由来。 GPG 和 PGP 都遵循 OpenPGP 加解密标准, 现在 PGP 被赛门铁克公司收购了。

我们平时用各个网站免不了要记住密码,但如果都用一个那风险就很高,如果每个网站都不一样,那也记不住。通常的做法是把这些密码存到一个文件里,但是这个文件本身的安全我们没法保证,所以我们需要对这个文件进行加密。这就要用到我们今天的主角 GPG

安装

安装就非常简单,没什么好说的,执行命令就完成了。我的是通过二进制文件下载的中文版,如果是brew下载应该是英文的,本文以英文版的为教程(中文的我就不多bb了)

Mac

brew install gpg

生成密钥

现在我们通过 gpg --full-gen-key 来生成密钥。

密钥生成
密钥生成

Your selection? (选择要使用的加密算法),选1就行了

RSA keys may be between 1024 and 4096 bits long,(选择加密算法的长度,默认是2048,我选了最长的 4096)

Please specify how long the key should be valid.(选择密钥过期时间,如果是自己使用的话,可以选择永不过期,此处我选的0)

Real name:(输入用户名,不能少于5个字符,随便写自己喜欢的名字就行了)

Email address(输入自己的邮箱)

Comment:(这个可以不写,直接回车)

Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? O(如果确认无误,输入 O)

通过上面的操作,生成了一个名为 lsygpg ,使用 RAS 算法加密,并且永不过期的账户。

你如果不想选择加密算法和长度信息,可以使用 gpg --gen-key 来快速生成。这样生成的默认算法是 RAS ,有效时间是一年, comment 为空。

生成撤销密钥

生成完密钥之后,为了保险起见,我们需要生成一个撤销证书,以便在日后我们不使用这个密钥的时候可以撤销。

这个撤销只有你把公钥上传到公钥服务器才有效,如果你不上传到公钥服务器其实没多大作用。即便申请撤销了,它还是会存在,只是不建议使用了。

撤销的命令如下

gpg --gen-revoke test1

加密

有了密钥之后,我们来看看怎么用它来加密一个文件

通过 gpg -r [uid] -o file -e file 来加密一个文件,其中 -r 指定用哪个用户加密, -o 表示加密后输出的文件, -e 表示要加密的文件。如果不用 -o 默认会在原来的文件后面添加 .gpg 的后缀,用来表示加密文件。

举个例子:假设我们有一个 test.txt 的文件,内容如下

我是帅哥

我们对其进行加密

gpg -r test1 -e test.txt

-- 可以使用 gpg -r test1 -o test.txt.gpg -e test.txt 效果是一样的

执行完成后会得到一个名为 test.txt.gpg 的文件,这个文件是一个二进制文件。

如果我们想要显示 ASCII ,可以通过添加 -a 来显示

密钥生成
密钥生成

解密

加密完之后,我们来看如何解密

通过 gpg -o file -d file 来对文件进行解密,其中 -o 表示解密后输出的文件,要放在前面, -d 表示要解密的文件。

我们就拿之前加密的文件来进行解密

gpg -o decrypt.txt -d test.txt.gpg
cat decrypt.txt
我是帅哥

gpg -o decrypt.txt -d test.txt.asc
cat decrypt.txt
我是帅哥

解密的时候会让你输入密码

密钥生成
密钥生成

签名

二进制签名

GPG除了可以用来加密,还可以用来签名,比如在 Github 上可以添加公钥来表示这个代码确实是你提交的。

使用 gpg --sign test.txttest.txt 进行签名,生成 test.txt.gpg ,里面的内容是二进制。

ASCII 签名

除了二进制的方式还可以输出 ASCII 的签名,用 gpg --clearsign test.txttest.txt 进行 ASCII 签名

gpg --clearsign test.txt
cat test.txt.asc
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA256

This is gpg test
-----BEGIN PGP SIGNATURE-----

iQIzBAEBCAAdFiEEiPHq0DgY+8QbgkHmOxWoUusKglEFAl41jDIACgkQOxWoUusK
glFEKhAAqwzhd4lexf1KyMTuCd5jAftPGB6AC1igmUx0gjpnMoZHv7gJkfFr8jTa
iD958jXVY4fawsBQ+LEEkpJarBdZfY2No5Dw1PSlRlaUzCQgMkOPgLTdqGHuTNB0
/ENsIiweXv5kUXiSU1Paxedwi7yux5L34WWdi9Mg9KoLhJN84HEdzIKYZjJNyFtB
WYP/Nqqqs01SBa3writrdVaj/ZaDqMtpzM9DSxfMT4P6NVDR3RGSTkQpnatEEa67
11i+oQXQcQT6a+O1vZ8GwbfoQ/EmPGT4nURs1HSEbAXj2aInquU5UjIvkvDp3q2x
j9UbDBcQaQWQdAsuJItIfLeyY1BhejqVIjhPPFMhplp5XrHMMR+JJXOUJleQkkZV
q35RitRlnRCjm+Z26aACS1vSS4Y23jaNV+MWv23OF570+iQ1lVotYLeLeMbuW4s9
oWQIqJydaePbL87wR3tTWm7OjlgZNrrSXh9aH366Oz5tjZVrZoJwNDupOj5uAgsf
T58N0St0OlrPO2csUQw5Kkd7Ls1lKCkh+drPQEPHJJODzNo4WxjtPGwgwhIhLJcw
o1TQxd3h5YhVInCs0XFzSx3Ty/Ds0Lm0zFa4AyINl0QiHkQy2OoD4rsFO7n6LdOk
zJKrFEkSwuvTOeIBUOGulwZiZEFrxb9KpaCjhMLZgQfjSYAnyQ8=
=lmwE
-----END PGP SIGNATURE-----

这种方式会在源文件里加上签名。

Built with Hugo