欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

gpg使用方法

程序员文章站 2022-07-14 12:47:56
...

功能概述

  • 生成gpg**,keysize设置为2046长度,过期期限设置无限
  • 导出公钥
  • 上传到debian、ubuntu和openpgp网站
  • 下载公钥到本地
  • 导入公钥/私钥到本地
  • 签名文件 + 检查文件签名
  • 加密文件 + 解密文件
  • 加密签名文件 + 解密验证文件

需求背景

  • debian上游推包需要,debian上游源码包也有签名机制

现实中怎么使用这个算法,对信息加密和解密。这要用到GnuPG软件(简称GPG),它是目前最流行、最好用的加密工具之一。

1 什么是GPG

要了解什么是GPG,就要先了解PGP。
1991年,程序员Phil Zimmermann为了避开*监视,开发了加密软件PGP。这个软件非常好用,迅速流传开来,成了许多程序员的必备工具。
但是,它是商业软件,不能*使用。所以,*软件基金会决定,开发一个PGP的替代品,取名为GnuPG。这就是GPG的由来。
GPG有许多用途,本文主要介绍文件加密。至于邮件的加密,不同的邮件客户端有不同的设置,请参考Ubuntu网站的介绍。
本文的使用环境为Linux命令行。如果掌握了命令行,Windows 或 Mac OS 客户端,就非常容易掌握。GPG并不难学,学会了它,从此就能轻松传递加密信息。
建议读者一步步跟着教程做,对每条命令都自行测试。

2 安装(跳过-UOS系统已集成)

Debian环境

$ sudo apt-get install gnupg

Fedora 环境

$ yum install gnupg

安装完成后,键入下面的命令

$ gpg --help

如果屏幕显示GPG的帮助,就表示安装成功。

3 生成**

安装成功后,使用gen-ken参数生成自己的**,新版gpg --gen-key流程被简化

$ gpg --full-generate-key

回车以后,会跳出一大段文字

Copyright (C) 2018 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

请选择您要使用的**种类:
 (1) RSA and RSA (default)
 (2) DSA and Elgamal
 (3) DSA (仅用于签名) 
 (4) RSA (仅用于签名)
您的选择?

第一段是版权声明,然后让用户自己选择加密算法。默认选择第一个选项,表示加密和签名都使用RSA算法。
然后,系统就会问你**的长度。

RSA **长度应在 1024 位与 4096 位之间。
您想要用多大的**尺寸?(2048)

**越长越安全,默认是2048位,建议设置为4096符合debian规范要求,接着设定**的有效期。

请设定这把**的有效期限。
  0 = **永不过期
 <n> = **在 n 天后过期
 <n>w = **在 n 周后过期
 <n>m = **在 n 月后过期
 <n>y = **在 n 年后过期
 **的有效期限是?(0)

如果**只是个人使用,并且你很确定可以有效保管私钥,建议选择第一个选项,即永不过期。
回答完上面三个问题以后,系统让你确认。

以上正确吗?(y/n)

输入y,系统就要求你提供个人信息。

您需要一个用户标识来辨识您的**;本软件会用真实姓名、注释和电子邮件地址组合成用户标识,如下所示:
"Ma Aiguo <[email protected]>"
真实姓名:
电子邮件地址:
注释:

"真实姓名"填入你姓名的英文写法,"电子邮件地址"填入你的邮件地址,"注释"这一栏可以空着。
然后,你的"用户ID"生成了。

您选定了这个用户标识:
 "Ma Aiguo <[email protected]>"

我的"真实姓名"是Ma Aiguo,“电子邮件地址"[email protected],所以我的"用户ID"就是"Ma Aiguo [email protected]”。
系统会让你最后确认一次。

更改姓名(N)、注释(C)、电子邮件地址(E)或确定(O)/退出(Q)?

输入O表示"确定"。
接着,系统会让你设定一个私钥的密码。这是为了防止误操作,或者系统被侵入时有人擅自动用私钥。

您需要一个密码来保护您的私钥:

然后,系统就开始生成**了,这时会要求你做一些随机的举动,以生成一个随机数。

我们需要生成大量的随机字节。这个时候您可以多做些琐事(像是敲打键盘、移动鼠标、读写硬盘之类的),这会让随机数字发生器有更好的机会获得足够的熵数。

几分钟以后,系统提示**已经生成了。

gpg: ** 50C0FC5D0B1B7D1495306EA3B47FCFA53F9B0E12 被标记为绝对信任
公钥和私钥已经生成并经签名。

请注意上面的字符串"50C0FC5D0B1B7D1495306EA3B47FCFA53F9B0E12",这是"用户ID"的Hash字符串,可以用来替代"用户ID"。
这时,最好再生成一张"撤销证书",以备以后**作废时,可以请求外部的公钥服务器撤销你的公钥。

$ gpg --gen-revoke [用户ID] 

上面的"用户ID"部分,可以填入你的邮件地址或者Hash字符串(以下同)。

4 **管理

4.1 列出**

list-keys参数列出系统中已有的**.

$ gpg --list-keys

显示结果如下:

$  gpg --list-keys
/home/xxx/.gnupg/pubring.kbx
--------------------------------
pub   rsa4096 2021-03-03 [SC]
      50C0FC5D0B1B7D1495306EA3B47FCFA53F9B0E12
uid           [ 绝对 ] Ma Aiguo <[email protected]>
sub   rsa4096 2021-03-03 [E]

pub   rsa4096 2021-03-03 [SC]
      277A69AE77606279FF32978831CC996766F05BA0
uid           [ 绝对 ] Ma Aiguo <[email protected]>
sub   rsa4096 2021-03-03 [E]

第一行显示公钥文件名(pubring.kbx),第二行显示公钥特征(4096位,Hash字符串和生成时间),第三行显示"用户ID",第四行显示私钥特征。

4.2 删除**

如果你要从**列表中删除某个**,可以使用delete-key参数。

$ gpg --delete-secret-keys  [用户ID]  # 删除私钥,  UID 也可以替换成子**ID, 主**Key ID
$ gpg --delete-keys  [用户ID]     # 删除公钥

4.3 输出**

公钥文件(.gnupg/pubring.kbx)以二进制形式储存,armor参数可以将其转换为ASCII码显示。

$ gpg --armor --output public-key.txt --export [用户ID]

"用户ID"指定哪个用户的公钥,output参数指定输出文件名(public-key.txt)。
类似地,export-secret-keys参数可以转换私钥。

$ gpg --armor --output private-key.txt --export-secret-keys [用户ID]

导出公钥到终端

gpg --export --export-options export-minimal --armor  28889AE77606279FF32978831CC996766F06666

4.4 上传公钥

公钥服务器是网络上专门储存用户公钥的服务器。send-keys参数可以将公钥上传到服务器。
网页上传
https://keys.openpgp.org / keys.openpgp.org
keyserver.ubuntu.com

网页上传后,ubuntu和opengpg需要邮箱验证一下,可能会被拉入垃圾邮件
验证好了在搜索栏输入0xUID 即可查询公钥信息和下载
比如输入0x50C0FC5D0B1B7D1495306EA3B47FCFA53F9B0E12

命令上传地址,执行如下命令目前没有返回任何结果,从debian网站上得知每个月会同步一次keyring,保证keyring上传到ubuntu和openpgp即可
仅限于DM和DD用户
keyring.debian.org

$ gpg --send-keys [用户ID] --keyserver keyring.debian.org

使用上面的命令,你的公钥就被传到了服务器keyring.debian.org,然后通过交换机制,所有的公钥服务器最终都会包含你的公钥。
由于公钥服务器没有检查机制,任何人都可以用你的名义上传公钥,所以没有办法保证服务器上的公钥的可靠性,通过公钥指纹校验。

debian打包上传需要的公钥 debian mentors放到这里,需要注册账号

  • https://mentors.debian.net/accounts/profile/

4.5 公钥指纹

你可以在网站上公布一个公钥指纹,让其他人核对下载到的公钥是否为真。fingerprint参数生成公钥指纹。

$ gpg --fingerprint [用户ID]

4.6 导入**

除了生成自己的**,还需要将他人的公钥或者你的私钥**输入系统。这时可以使用import参数。
导入公钥和私钥

$ gpg --import [**文件公钥/私钥]

查询公钥
为了获得他人的公钥,可以让对方直接发给你,或者到公钥服务器上寻找。

$ gpg --keyserver keys.openpgp.org --search-keys [用户ID]

从服务器导入公钥

$ gpg --keyserver keys.openpgp.org --recv-keys 50C0FC5D0B1B7D1495306EA3B47FCFA53F9B0E12
$ gpg --keyserver keys.openpgp.org --recv-keys 277A69AE77606279FF32978831CC996766F05BA0

正如前面提到的,我们无法保证服务器上的公钥是否可靠,下载后还需要用其他机制验证.

5 加密和解密

5.1 加密

假定有一个文本文件demo.txt,怎样对它加密呢?
encrypt参数用于加密,–recipient指定ID来加密

$ gpg --recipient [用户ID] --output demo.en.txt --encrypt demo.txt
$ gpg --recipient 50C0FC5D0B1B7D1495306EA3B47FCFA53F9B0E12 --output demo.en.txt --encrypt demo.txt

recipient参数指定接收者的公钥,output参数指定加密后的文件名,encrypt参数指定源文件。运行上面的命令后,demo.en.txt就是已加密的文件,可以把它发给对方。

5.2 解密

对方收到加密文件以后,就用自己的私钥解密。

$ gpg --output log.de.txt --decrypt log.en.txt

decrypt参数指定需要解密的文件,output参数指定解密后生成的文件。运行上面的命令,demo.de.txt就是解密后的文件。
GPG允许省略decrypt参数。

$ gpg demo.en.txt

运行上面的命令以后,解密后的文件内容直接显示在标准输出。

6 签名

6.1 对文件签名

有时,我们不需要加密文件,只需要对文件签名,表示这个文件确实是我本人发出的。sign参数用来签名。
–local-user 指定本地ID签名

$ gpg --sign log.txt
$ gpg --local-user 277A69AE77606279FF32978831CC996766F05BA0 --sign log.txt 

运行上面的命令后,当前目录下生成log.txt.gpg文件,这就是签名后的文件。这个文件默认采用二进制储存,如果想生成ASCII码的签名文件,可以使用clearsign参数。

$ gpg --clearsign log.txt

运行上面的命令后 ,当前目录下生成demo.txt.asc文件,后缀名asc表示该文件是ASCII码形式的。
如果想生成单独的签名文件,与文件内容分开存放,可以使用detach-sign参数。

$ gpg --detach-sign log.txt

运行上面的命令后,当前目录下生成一个单独的签名文件demo.txt.sig。该文件是二进制形式的,如果想采用ASCII码形式,要加上armor参数。

$ gpg --armor --detach-sign log.txt

6.2 签名+加密

如果想同时签名和加密,可以使用下面的命令,产生log.txt.asc文件,这个文件包含被加密文件和签名信息
做解密的时候会输出签名检查信息和文件内容

$ gpg --local-user [发信者ID] --recipient [接收者ID] --armor --sign --encrypt log.txt
$ gpg --local-user 50C0FC5D0B1B7D1495306EA3B47FCFA53F9B0E12 --recipient 277A69AE77606279FF32978831CC996766F05BA0 --armor --sign --encrypt log.txt

local-user参数指定用发信者的私钥签名,recipient参数指定用接收者的公钥加密,armor参数表示采用ASCII码形式显示,sign参数表示需要签名,encrypt参数表示指定源文件。
这个

$ gpg --local-user 50C0FC5D0B1B7D1495306EA3B47FCFA53F9B0E12 --recipient 50C0FC5D0B1B7D1495306EA3B47FCFA53F9B0E12 --armor --sign --encrypt log.txt
$ ls -la
总用量 16
drwxr-xr-x  2 ephraim ephraim 4096 3月   3 15:40 .
drwxr-xr-x 36 ephraim ephraim 4096 3月   3 15:40 ..
-rw-r--r--  1 ephraim ephraim   29 3月   3 15:32 log.txt
-rw-r--r--  1 ephraim ephraim 1699 3月   3 15:40 log.txt.asc
$ 
$ gpg --output log.de.txt --decrypt log.txt.asc
gpg: 由 4096 位的 RSA **加密,标识为 8CE27EA321F8DF90,生成于 2021-03-03
      “Ma Aiguo <[email protected]>”
gpg: 签名建立于 2021年03月03日 星期三 15时40分47秒 CST
gpg:               使用 RSA ** 50C0FC5D0B1B7D1495306EA3B47FCFA53F9B0E12
gpg: 完好的签名,来自于 “Ma Aiguo <[email protected]>” [绝对]
$  ls            
log.de.txt  log.txt.asc
$ cat log.de.txt 
abcdefg
hijklmnopqrst
uvwxyz
$ 

6.3 验证签名

我们收到别人签名后的文件,需要用对方的公钥验证签名是否为真。verify参数用来验证。
签名asic文件和文件本身分离,验证命令方法

$ gpg --verify log.txt.asc log.txt
gpg: 签名建立于 2021年03月03日 星期三 15时25分11秒 CST
gpg:               使用 RSA ** 50C0FC5D0B1B7D1495306EA3B47FCFA53F9B0E12
gpg: 完好的签名,来自于 “Ma Aiguo <[email protected]>” [绝对]

举例,debian网站就提供每一个下载源码包gpg签名文件。你可以根据说明,验证这些下载包是否为真。
https://www.debian.org/distrib/packages
从网址下载gnupg软件验证一下
https://packages.debian.org/buster/gnupg
下载软件源码包签名文件和源码压缩包文件

$ wget http://deb.debian.org/debian/pool/main/g/gnupg2/gnupg2_2.2.12.orig.tar.bz2.asc
$ wget http://deb.debian.org/debian/pool/main/g/gnupg2/gnupg2_2.2.12.orig.tar.bz2
$ gpg gnupg2_2.2.12.orig.tar.bz2.asc                                                     
gpg: 警告:没有提供命令。正在尝试猜测您的意图...
分离的签名。
请输入数据文件的名称: gnupg2_2.2.12
gnupg2_2.2.12-1deb10u1.dsc      gnupg2_2.2.12.orig.tar.bz2.asc  
请输入数据文件的名称: gnupg
gnupg_2.2.12-1+deb10u1_all.deb  gnupg2_2.2.12-1deb10u1.dsc      gnupg2_2.2.12.orig.tar.bz2.asc  
请输入数据文件的名称: gnupg_2.2.12-1+deb10u1_all.deb 
gpg: 签名建立于 2018年12月14日 星期五 22时34分40秒 CST
gpg:               使用 RSA ** D8692123C4065DEA5E0F3AB5249B39D24F25E3B6
gpg: 无法检查签名:没有公钥
$ gpg --keyserver keyserver.ubuntu.com --recv-keys D8692123C4065DEA5E0F3AB5249B39D24F25E3B6
$ gpg gnupg2_2.2.12.orig.tar.bz2.asc                                                    
gpg: 警告:没有提供命令。正在尝试猜测您的意图...
gpg: 假定被签名的数据在‘gnupg2_2.2.12.orig.tar.bz2’
gpg: 签名建立于 2018年12月14日 星期五 22时34分40秒 CST
gpg:               使用 RSA ** D8692123C4065DEA5E0F3AB5249B39D24F25E3B6
gpg: 完好的签名,来自于 “Werner Koch (dist sig)” [未知]
gpg: 警告:此**未被受信任签名认证!
gpg:       没有证据表明此签名属于其声称的所有者。
主**指纹: D869 2123 C406 5DEA 5E0F  3AB5 249B 39D2 4F25 E3B6

7 参考文档

  1. debian
  • https://wiki.debian.org/Keysigning
  1. GPG入门教程
  • http://www.ruanyifeng.com/blog/2013/07/gpg.html
相关标签: gpg