gpg
- 这是一个gnu开源的非对称加密工具
- 核心围绕公私钥展开
0x1 密钥流程
使用流程一般如下:
用户A 生成密钥对:
- A.PUB:公钥,用于加密
- A.PRI:私钥,用于解密
- A将A.PUB发布到公网或者直接发送给B
- B导入A.PUB
- B使用A.PUB加密文件
- A收到A.PUB加密的文件后使用A.PRI的解密文件
注意:
- 每一个密钥拥有userid以及fingerprint两个主键
- gpg会将解密用的userid/fingerprint写入加密文件中
0x2 生成密钥
- 一切开始之前A需要先生成一份密钥,一共有三种主流方式
- 将
imazes
替换成自己想要的userid
# 根据userid 快速创建 gpg
gpg --quick-gen-key imazes
# 交互创建密钥对,可选加密方式等参数
gpg --full-gen-key
# 提供比 --full-gen-key 更多的自定义参数
gpg --gen-key
0x3 密钥管理
列出所有公钥
gpg -k
列出所有私钥
gpg -K
删除公钥(必须先删除私钥)
# 根据userid删除 gpg --delete-keys imazes # 根据指纹才能静默删除 gpg --delete-keys --batch --yes F192FCDD8E43ADFE8B27FDE6443CAC892F9FA987
删除私钥
gpg --delete-secret-keys imazes gpg --delete-secret-keys --batch --yes F192FCDD8E43ADFE8B27FDE6443CAC892F9FA987
公钥导入导出
gpg --export --armor imazes > imazes.pub.asc gpg --import imazes.pub.asc
私钥导入导出
gpg --export-secret-keys --armor imazes > imazes.asc gpg --import imazes.asc
特殊参数:
--yes
:使用yes
回答大多数交互选项--batch
:强制关闭交互选项,使用此选项时只能使用fingerprint标识目标--armor
:将密钥以文本形式存储
0x4 信任密钥
- 系统默认不信任第三方密钥
直接使用第三方证书时系统会发出警告,类似如下信息
It is NOT certain that the key belongs to the person named in the user ID. If you *really* know what you are doing, you may answer the next question with yes. Use this key anyway? (y/N)
解决办法有两个
直接信任证书
gpg --edit-key imazes trust 5 yes save
命令行忽略警告
gpg --batch --yes --trust-model always
还有一个不是很推荐的做法,自动信任所有证书
gpg --list-keys --fingerprint --with-colons | sed -E -n -e 's/^fpr:::::::::([0-9A-F]+):$/\1:6:/p' | gpg --import-ownertrust
0x5 加密解密
首先创建一份测试文件
echo 123 >test.txt
接着使用指定公钥加密
# 加密文件 gpg --recipient imazes --yes \ --output test.en.txt --encrypt test.txt # 强制使用证书 gpg --recipient imazes --yes \ --batch --yes --trust-model always \ --output test.en.txt --encrypt test.txt
--recipient
:指定使用的公钥--encrypt
:源文件--output
:输出文件
最后使用私钥解密
gpg --output test.de.txt --decrypt test.en.txt
0x6 分发密钥
- gun等组织提供
gpg
公共服务器用于公开的分享公钥 gpg内置的密钥服务器
keys.openpgp.org
在使用中有很多限制,不推荐使用可以选择一些第三方gpg服务器
# 服务器列表 hkps://keyserver.ubuntu.com hkps://keys.gnupg.net hkps://keyserver.linux.it hkps://keyring.debian.org # 参数 gpg --keyserver hkps://keyserver.ubuntu.com ...
发布到服务器
# 注意这里要使用指纹 gpg --keyserver hkps://keyserver.ubuntu.com \ --send-keys F192FCDD8E43ADFE8B27FDE6443CAC892F9FA987
在服务器搜索
gpg --keyserver hkps://keyserver.ubuntu.com \ --search-keys F192FCDD8E43ADFE8B27FDE6443CAC892F9FA987
从服务器下载
gpg --keyserver hkps://keyserver.ubuntu.com \ --recv-keys F192FCDD8E43ADFE8B27FDE6443CAC892F9FA987
从服务器删除(需要有私钥)
# 生成撤销声明 gpg --output revoke.asc --gen-revoke imazes # 导入到本地系统 gpg --import revoke.asc # 同步删除操作到服务器 gpg --keyserver hkps://keyserver.ubuntu.com \ --send-keys F192FCDD8E43ADFE8B27FDE6443CAC892F9FA987
0x7 对称加密
- gpg提供不是很安全的对称加密
- 仅在符合安全需求时可以使用
首先加密文件123.txt
gpg --quiet --batch --yes --symmetric --passphrase="asd" 123.txt
接着解密
gpg --quiet --batch --yes --decrypt --passphrase="asd" \ --output 123.de.txt 123.txt.gpg