使用GPG处理PGP初探
从入门到放弃(bushi
能读到咱这篇文章的,应该也不用咱赘述pgp是啥,能干什么用之类的了
GPG和PGP
pgp就是咱们常说的“优良保密协议”,目前来说,它代指一个标准,即RFC4880标准,
而GPG是”GnuPG”的缩写,是一个实现了pgp标准的开源软件。
生成密钥
一切从这里开始,输入gpg -h
可以看到帮助信息,一共有三个选项和生成密钥有关
1 |
|
这里推荐使用--full-generate-key
,这应该是最常用的选项
1 |
|
这里选择要生成的密钥种类,你可能发现了,条目前的序号似乎并不连续;如果查阅过其他教程,更会发现,几乎每个教程,这一步显示出来的种类都不一样
其实咱也不清楚为啥会这样.jpg ,但是这里只需要关心密钥所采用的算法即可,这里列出了你需要生成的密钥所采用的算法(RSA/DSA/ECC/…)。
如何选择密钥算法?
在业界,这仍然没有确定的答案,GPG所支持的所有算法都足够强大且不易被破解,所以给出“最佳算法”往往带有很强的主观成分
GPG给出的默认值
- 在十年前,GPG在这里给出了RSA作为推荐的默认算法,因为RSA具有最强的兼容性,并且被认为“在未来的数年里可以提供合理的安全性”,
- 但是现在,再这里的默认算法是ECC,因为ECC在256位密钥下就可以达到媲美RSA在3072位密钥下的表现,
(未来属于椭圆曲线bushi)
如此看来,ECC应当领先于RSA很多对吧?但是为什么如今RSA仍然没有被ECC取代呢?
第一是因为相比于RSA,ECC的兼容性还是差了不少
第二是因为专利问题
言归正传,咱们在这里推荐先选择RSA (sign only)
条目,简单一点
- 注意:带and的条目,都是生成一个主密钥和一个子秘钥,新手可以先别选它们 这里询问你需要生成的密钥长度,当然是越长越安全,但是越长的密钥在生成和使用时会耗费更长的时间,这里咱填了4096。
1
2RSA keys may be between 1024 and 4096 bits long.
What keysize do you want? (2048)这里选择密钥的有效期1
2
3
4
5
6
7
8Requested keysize is 4096 bits
Please specify how long the key should be valid.
0 = key does not expire
<n> = key expires in n days
<n>w = key expires in n weeks
<n>m = key expires in n months
<n>y = key expires in n years
Key is valid for? (0) - 输入0则永久有效
- 在生成后可以随时更改有效期。但是在实际使用中,更有效期后,你可能需要非常麻烦地重新发布你的公钥
1
2Key does not expire at all
Is this correct? (y/N)
问你是否正确,输入y确定
接下来,PGP将询问你三条信息来建立这个密钥的身份信息,
PGP依靠一个用户ID
来确定一个唯一的身份信息,这个用户ID由真实名字(Real name)
、邮箱(Email address)
、备注(Comment)
三个部分组成,
1 |
|
备注(Comment)字段可以为空
最后使用O
确认
1 |
|
这里的意思是,程序正在收集随机值(从硬盘操作,鼠标移动,键盘输入等),但是请注意,不要在这个命令窗口中随机敲击键盘,你的输入会在随机值生成完毕后作为正常输入被敲进下一行命令。
同时,这里会弹出窗口让你输入私钥的密码,会弹两次(一次输入,一次验证是否正确)。
1 |
|
最后,你现在应该已经拥有了一个pgp密钥
导出/导入密钥
导出
gpg --output <文件名> --armor --export <密钥id>
这样会导出指定密钥的公钥,这包括主密钥的公钥和所有的子秘钥的公钥
参数解释:
--output <文件名>
指定要保存的文件名--armor
导出为文本,而不是一个二进制文件--export <密钥id>
导出公钥,同时这里换成--export-secret-key
可以导出私钥
导入
WIP
子秘钥
- 子秘钥的算法和主密钥无关,可以选择和主密钥不同的算法和长度
如何使用子秘钥
事实上,没有办法指定使用哪个子秘钥,在执行操作(签名/加密/…)时,你只能指定你的主密钥id,然后gpg会自动选择选择使用哪一个子密钥(会根据密钥长度,你指定的密钥用途等参数),
你可以指定每一个子秘钥有什么用途(C/S/A/E标志),但是如果有两个子秘钥都具有相同的用途,比如你需要加密一个文件,而你指定的主密钥下有多个子秘钥均拥有E标志,则具体使用哪一个子秘钥取决与gpg的实现, 你不能自己指定 。
实际应用
WIP
在邮件中使用
在git提交中使用
