从入门到放弃(bushi

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


GPG和PGP

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

生成密钥

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

--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,这应该是最常用的选项

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给出的默认值

P.S. : 咱的看法,目前是不推荐RSA了,越来越多的迹象表明,计算机科学的发展已经逼近RSA的安全阈值,破解一份RSA密钥的成本也将在可预期的未来变得可以被接受

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

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

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

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确认

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.

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

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的实现, 你无法自己指定

实际应用

在邮件中使用

你可以为你的邮件加密、或者签名
加密可以做到

在git提交中使用

密钥过渡

如果你需要更换你的主密钥,无论是它的有效期临近,或是它使用的算法已经不再安全

通过编写并签名一份 “GPG Key Transition” 来向他人说明你已经更新了你的主密钥
TIP -> 以GPG Key Transition为关键词,可以在google上找到不少例子
这里有一份ubuntu的GPG迁移实践,这应该较为权威