🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
[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> = 密钥在 n 天后过期    <n>w = 密钥在 n 周后过期    <n>m = 密钥在 n 月后过期    <n>y = 密钥在 n 年后过期   密钥的有效期限是?(0) // 第四步:系统就要求你提供个人信息.进行反复确定   真实姓名:   电子邮件地址:   注释: //会生成用户id 如下形式 "Heinrich Heine (Der Dichter) <heinrichh@duesseldorf.de>" // 第五步:系统会让你设定一个私钥的密码 //几分钟以后,系统提示密钥已经生成了 gpg: 密钥 EDDD6D76 被标记为绝对信任   公钥和私钥已经生成并经签名 ``` - "用户ID" 格式为"Heinrich Heine (Der Dichter) <heinrichh@duesseldorf.de>" - "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://img.kancloud.cn/f1/50/f15001cc001f26906753e62a6dbb10e4_420x337.png) #### 签名与文件分开 demo.txt.sig ``` gpg --armor --detach-sign demo.txt ``` windows 通过 Kleopatra 软件可以打开时候注意签名与原始文件访问要放一块 ![](https://img.kancloud.cn/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 ```