首页 友人帐 关于我

使用GPG处理PGP初探

2022-06-08

从入门到放弃(bushi

能读到咱这篇文章的,应该也不用咱赘述pgp是啥,能干什么用之类的了


GPG和PGP

pgp就是咱们常说的“优良保密协议”,目前来说,它代指一个标准,即RFC4880标准,
而GPG是”GnuPG”的缩写,是一个实现了pgp标准的开源软件。

生成密钥

一切从这里开始,输入gpg -h可以看到帮助信息,一共有三个选项和生成密钥有关

1
2
3
--generate-key                 generate a new key pair
--quick-generate-key quickly generate a new key pair
--full-generate-key full featured key pair generation

这里推荐使用--full-generate-key,这应该是最常用的选项

1
2
3
4
5
6
7
8
9
10
11
12
13
14
S:\work_temp\ayw>gpg --full-generate-key
gpg (GnuPG) 2.3.6; Copyright (C) 2021 g10 Code GmbH
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Please select what kind of key you want:
(1) RSA and RSA
(2) DSA and Elgamal
(3) DSA (sign only)
(4) RSA (sign only)
(9) ECC (sign and encrypt) *default*
(10) ECC (sign only)
(14) Existing key from card
Your selection?

这里选择要生成的密钥种类,你可能发现了,条目前的序号似乎并不连续;如果查阅过其他教程,更会发现,几乎每个教程,这一步显示出来的种类都不一样

其实咱也不清楚为啥会这样.jpg ,但是这里只需要关心密钥所采用的算法即可,这里列出了你需要生成的密钥所采用的算法(RSA/DSA/ECC/…)。

如何选择密钥算法?

在业界,这仍然没有确定的答案,GPG所支持的所有算法都足够强大且不易被破解,所以给出“最佳算法”往往带有很强的主观成分
GPG给出的默认值

如此看来,ECC应当领先于RSA很多对吧?但是为什么如今RSA仍然没有被ECC取代呢?
第一是因为相比于RSA,ECC的兼容性还是差了不少
第二是因为专利问题

言归正传,咱们在这里推荐先选择RSA (sign only)条目,简单一点

问你是否正确,输入y确定

接下来,PGP将询问你三条信息来建立这个密钥的身份信息,
PGP依靠一个用户ID来确定一个唯一的身份信息,这个用户ID由真实名字(Real name)邮箱(Email address)备注(Comment)三个部分组成,

1
2
3
4
5
6
7
8
9
GnuPG needs to construct a user ID to identify your key.

Real name: test
Email address: test@smyhw.online
Comment:
You selected this USER-ID:
"test <test@smyhw.online>"

Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit?

备注(Comment)字段可以为空
最后使用O确认

1
2
3
4
We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard, move the mouse, utilize the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.

这里的意思是,程序正在收集随机值(从硬盘操作,鼠标移动,键盘输入等),但是请注意,不要在这个命令窗口中随机敲击键盘,你的输入会在随机值生成完毕后作为正常输入被敲进下一行命令。
同时,这里会弹出窗口让你输入私钥的密码,会弹两次(一次输入,一次验证是否正确)。

1
2
3
4
5
Note that this key cannot be used for encryption.  You may want to use
the command "--edit-key" to generate a subkey for this purpose.
pub rsa4096 2022-06-09 [SC]
95A32031500EC67D8060F9236715CC3A19CC6770
uid test <test@smyhw.online>

最后,你现在应该已经拥有了一个pgp密钥

导出/导入密钥

导出

gpg --output <文件名> --armor --export <密钥id>
这样会导出指定密钥的公钥,这包括主密钥的公钥和所有的子秘钥的公钥
参数解释:

导入

WIP

子秘钥

如何使用子秘钥

事实上,没有办法指定使用哪个子秘钥,在执行操作(签名/加密/…)时,你只能指定你的主密钥id,然后gpg会自动选择选择使用哪一个子密钥(会根据密钥长度,你指定的密钥用途等参数),
你可以指定每一个子秘钥有什么用途(C/S/A/E标志),但是如果有两个子秘钥都具有相同的用途,比如你需要加密一个文件,而你指定的主密钥下有多个子秘钥均拥有E标志,则具体使用哪一个子秘钥取决与gpg的实现, 你不能自己指定

实际应用

WIP

在邮件中使用

在git提交中使用





知识共享许可协议
本作品采用知识共享署名 4.0 国际许可协议进行许可。