GnuPG使用探索
Table of Contents
1. 生成密钥
gpg --gen-key
更全面的生成
gpg --full-generate-key
2. 查看保存的密钥
2.1. 查看保存的公钥
gpg --list-keys
2.2. 查看保存的私钥
gpg --list-secret-keys
3. 术语相关解释
3.1. keyid
3.1.1. short版本
你的公钥fingerprint的末尾8位数字,当然是ascii版本。
3.1.2. long版本
你的公钥fingerprint的末尾16位数字。
3.2. user-id
pub rsa3072 2022-12-21 [SC]
FE9DAF93927CECCDCF0F1EDDCBD2D53485843602
uid [ 绝对 ] testa (comment) <aaa@mail.com>
sub rsa3072 2022-12-21 [E]
这里testa可以认为是user-id,括号里的东西是在gen-key的时候输入的注释。
3.3. fingerprint
其实是缩短版本的公钥,因为他的传播更简单,更方便你向其他人展示,比如在ppt上放,其他人可以对拿到的你的公钥进行指纹计算,再把结果和你的指纹对比,就可以确认公钥的真实性。
4. 功能
其实大体上有两个主要功能,其他如Certify和Auth用的无感或者比较少。
4.1. 签名和验证
4.1.1. 签名
gpg --sign file
如果要生成可打印的ascii版本,可以用
gpg --clearsign file
如果需要单独分离出来的签名文件,可以用
gpg --detach-sign file
如果需要单独分离出来的可打印的ascii版本的签名文件,可以用
gpg --detach-sign --armor file
4.1.2. 验证
首先确保你导入了签名者的公钥 其次请查看对比导入的公钥的指纹,以及你从可信渠道获得的签名者的指纹是否一致 之后再进行验证
gpg --verify sig_file
4.1.3. 加密和解密
- 加密
gpg --recipent/-r user_id --encrypt/-e file
如果要加密成可打印的ascii文本,可以用
gpg --armor/-a --recipent/-r user_id --encrypt/-e file
可以指定多个接受者
gpg --armor/-a --recipent/-r user_id1 user_id2 --encrypt/-e file
- 解密
gpg --decrypt/-d encrypted_file --output decrypted_file
这时候会用你的私钥去解密,如果不加
--output选项的话,就会把解密结果输出到stdout
5. 待了解方面 [75%]
[ ]子密钥如何和主密钥绑定的- 交叉验证
[X]在有多个子钥情况下,是否只需要公布主密钥的公钥部分和其指纹即可- 实际上,当你添加一个子钥之后,主密钥的导出公钥是会增长的,包含了你的子密钥的公钥,但是指纹是你主公钥的指纹,这个不会改变。 我猜测,应该是gpg导入公钥后自动解析,分离出主公钥和子公钥,然后单独计算主公钥的指纹并告诉你。 实际上,经过我自己对比发现,导出公钥会存在一些空格,这些空格分割开不同含义的字段。
[X]理解撤销证书是如何起作用的- 生成撤销证书是不会改变原本的密钥信息的
- 生成撤销证书需要使用相应密钥的私钥
- 猜测:撤销证书不过是一句话的签名,这句话可以是“我是a,我不用ABC这个密钥了”,然后把这句话的文本编码用ABC这个密钥的私钥签名,之后发布出去, 其他人再搜索a的公钥的时候会获取这个证书,他可以用得到的a的公钥来验证这句话就是a说的,然后就不再相信这个密钥。
- 实际上这是一种自我放弃,当你的密钥泄露的时候,你有你的私钥,还有其他人有,然后你高呼:“大家快跑,别再相信这里了!”很显然,其他也有你私钥的人是不会这么说的, 如此一来就相当于撤销了这个密钥的真实性。
[X]理解web of trust是如何具体实现的,比如我如何通过签名一个公钥来告诉别人我信任它- 是通过签名来实现的,比如我可以把“a拥有ABC这个密钥,我是b我说的”这句unicode编码或者英文的ascii编码的话用我的私钥签名,生成一个sig文件 然后别人搜索a这个人的时候,也会获得这个sig,然后他就会找b的公钥来验证这个签名,验证通过后他就知道,这个a的公钥b已经担保过了。1