GPG 加密工具
最后更新于:2022-04-02 03:51:18
[TOC]
> [参考](https://www.ruanyifeng.com/blog/2013/07/gpg.html)
## 概述
GPG有许多用途,加密文件,加密邮箱
## 语法
```
-s, --sign [文件名] 生成一份签名
--clearsign [文件名] 生成一份明文签名
-b, --detach-sign 生成一份分离的签名
-e, --encrypt 加密数据
-c, --symmetric 仅使用对称加密
-d, --decrypt 解密数据(默认)
--verify 验证签名
--list-keys 列出密钥
--list-sigs 列出密钥和签名
--check-sigs 列出并检查密钥签名
--fingerprint 列出密钥和指纹
-K, --list-secret-keys 列出私钥
--gen-key 生成一副新的密钥对
--delete-keys 从公钥钥匙环里删除密钥
--delete-secret-keys 从私钥钥匙环里删除密钥
--sign-key 为某把密钥添加签名
--lsign-key 为某把密钥添加本地签名
--edit-key 编辑某把密钥或为其添加签名
--gen-revoke 生成一份吊销证书
--export 导出密钥
--send-keys 把密钥导出到某个公钥服务器上
--recv-keys 从公钥服务器上导入密钥
--search-keys 在公钥服务器上搜寻密钥
--refresh-keys 从公钥服务器更新所有的本地密钥
--import 导入/合并密钥
--card-status 打印卡状态
--card-edit 更改卡上的数据
--change-pin 更改卡的 PIN
--update-trustdb 更新信任度数据库
--armor 文本形式导出
--print-md 算法 [文件]
```
## 安装
```
sudo apt-get install gnupg
yum install gnupg
// widnows
choco install Gpg4win
brew install GnuPG
```
## 使用
### 密钥管理
#### 生成密钥
```
> gpg --gen-key
// 第一步:询问加密算法
请选择您要使用的密钥种类:
(1) RSA and RSA (default)
(2) DSA and Elgamal
(3) DSA (仅用于签名)
(4) RSA (仅用于签名)
// 第二步:询问加密长度
RSA 密钥长度应在 1024 位与 4096 位之间。
您想要用多大的密钥尺寸?(2048)
// 第三步:设定密钥的有效期
请设定这把密钥的有效期限。
0 = 密钥永不过期
= 密钥在 n 天后过期
w = 密钥在 n 周后过期
m = 密钥在 n 月后过期
y = 密钥在 n 年后过期
密钥的有效期限是?(0)
// 第四步:系统就要求你提供个人信息.进行反复确定
真实姓名:
电子邮件地址:
注释:
//会生成用户id 如下形式 "Heinrich Heine (Der Dichter) "
// 第五步:系统会让你设定一个私钥的密码
//几分钟以后,系统提示密钥已经生成了
gpg: 密钥 EDDD6D76 被标记为绝对信任
公钥和私钥已经生成并经签名
```
- "用户ID" 格式为"Heinrich Heine (Der Dichter) "
- "EDDD6D76",这是"用户ID"的Hash字符串,可以用来替代"用户ID"
#### 创建"撤销证书"
好再生成一张"撤销证书",以备以后密钥作废时,可以请求外部的公钥服务器撤销你的公钥
```
gpg --gen-revoke [Hash字符串]
```
#### 密钥管理
```
> gpg --list-keys
C:/Users/idcpj/AppData/Roaming/gnupg/pubring.kbx
------------------------------------------------
pub rsa3072 2020-11-13 [SC] [expires: 2022-11-13]
35DE33F5790DDC120..F54007C
uid [ultimate] idcpj <260xx3304@qq.com>
sub rsa3072 2020-11-13 [E] [expires: 2022-11-13]
```
- 第一行显示公钥文件名(pubring.gpg)
- 第二行显示公钥特征(4096位,Hash字符串和生成时间)
- 第三行显示"用户ID"
- 第四行显示私钥特征
#### 刪除秘钥
```
gpg --delete-key <用户id>
```
#### 输出公钥/密钥
输出公钥
```
gpg --armor --output public-key.txt --export <用户id>
```
输出秘钥
```
gpg --armor --output private-key.txt --export-secret-keys
```
#### 上传公钥
公钥服务器是网络上专门储存用户公钥的服务器。send-keys参数可以将公钥上传到服务器。
```
gpg --send-keys <用户id> --keyserver hkp://subkeys.pgp.net
```
由于公钥服务器没有检查机制,任何人都可以用你的名义上传公钥,所以没有办法保证服务器上的公钥的可靠性。通常,你可以在网站上公布一个公钥指纹,让其他人核对下载到的公钥是否为真。fingerprint参数生成公钥指纹
```
> gpg --fingerprint <用户id>
gpg: checking the trustdb
gpg: marginals needed: 3 completes needed: 1 trust model: pgp
gpg: depth: 0 valid: 2 signed: 0 trust: 0-, 0q, 0n, 0m, 0f, 2u
gpg: next trustdb check due at 2022-11-13
pub rsa3072 2020-11-13 [SC] [expires: 2022-11-13]
7EF2 02EE AD4D 85D9 E9F8 AF16 6708 7203 CDCE C74E
uid [ultimate] idcpj <2600@qq.com>
sub rsa3072 2020-11-13 [E] [expires: 2022-11-13]
```
#### 输入密钥
除了生成自己的密钥,还需要将他人的公钥或者你的其他密钥输入系统。这时可以使用import参数。
```
gpg --import [密钥文件]
```
为了获得他人的公钥,可以让对方直接发给你,或者到公钥服务器上寻找。
```
gpg --keyserver hkp://subkeys.pgp.net --search-keys <用户id>
```
### 加密和解密
加密
```
gpg --recipient <用户id> --output demo.en.txt --encrypt demo.txt
```
解密
```
gpg --decrypt demo.en.txt --output demo.de.txt
// GPG允许省略decrypt参数
gpg demo.en.txt
```
### 签名
- 有时候我们不需要加密文件,只要说明这个文件是我本人发出的,可以使用
#### 签名与文件一块
生成 demo.txt.gpg
```
> gpg --sign demo.txt
```
windows 通过 Kleopatra 软件可以打开
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/f1/50/f15001cc001f26906753e62a6dbb10e4_420x337.png)
#### 签名与文件分开
demo.txt.sig
```
gpg --armor --detach-sign demo.txt
```
windows 通过 Kleopatra 软件可以打开时候注意签名与原始文件访问要放一块
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/96/3a/963a4cb4d0433ccc486857d666777db8_449x358.png)
### 签名+加密
```
gpg --local-user [发信者ID] --recipient [接收者ID] --armor --sign --encrypt demo.txt
```
### 验证签名
验证前需先把公钥导入进 系统
```
// 导出公钥
> gpg --armor --output public-key.txt --export <用户id>
// 在其他服务器导入公钥
> gpg --import public-key.txt
// 进行验证
> gpg --verify demo.txt.asc demo.txt
```
';