GPG or GnuPG 是目前最流行、最好用的加密工具之一。是由GNU出品的PGP的开源实现版本.广泛应用于加密、数字签章及产生非对称匙对等.


Table of Contents

  1. Why Use GPG?
  2. 如何获取GPG呢?
    1. Under Linux
    2. Under Mac
    3. 源码安装
  3. 怎么使用GPG呢?
    1. 生成个人密钥
    2. 管理个人密钥
      1. 列出密钥
      2. 删除密钥
      3. 输出密钥
      4. 上传密钥
      5. 导入密钥
    3. 文件加密解密
      1. 文件加密
      2. 文件解密
    4. 文件数字签名
      1. 对文件签名
      2. 对文件签名验证
      3. 签名并加密
      4. 验证签名并解密
    5. 邮件加密解密

Why Use GPG?

自从登登同学勇敢举报了美帝大范围窃听民众通讯之后, 越来越多的人开始注意自己的个人隐私(o()o (好~~). 其推荐的tails也是非常不错. 用GPG来加密往来邮件, 加密文件, 以防 帝国 美帝 窃听个人隐私…("▔□▔).(万一你写给女盆友的 亲密的 情书被偷看了, 嗯…


如何获取GPG呢?

Under Linux

在fedora/SL/Centos下:

1
2
3
sudo dnf install -y gnupg2
#or
sudo yum install -y gnupg2

debian/ubuntu:

1
2
3
sudo apt-get install gnupg2
#or
sudo apt install gnupg2

opensuse:

1
sudo zypper in gnupg2

Under Mac

mac下的推荐GPGTools, 直接下载安装就好了. 还有一个macgpg, 现在不推荐使用了.

源码安装

如果想自己编译,可以下载源码编译安装.


怎么使用GPG呢?

生成个人密钥

在终端下运行如下命令

1
gpg --gen-key

会看到如下的输出:

1
2
3
4
5
6
7
8
9
10
11
12
gpg (GnuPG) 1.4.19; Copyright (C) 2015 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

gpg: keyring '/home/dark/.gnupg/secring.gpg' created
gpg: keyring '/home/dark/.gnupg/pubring.gpg' created
Please select what kind of key you want:
(1) RSA and RSA (default)
(2) DSA and Elgamal
(3) DSA (sign only)
(4) RSA (sign only)
Your selection?

一般选择 1 就好, 接下来就是密钥的长度,过期时效,名字,邮箱,注释, 最后输入密码(一定要记住).最后的最后确认一遍, 然后随便做点什么小动作给他点熵值.

几分钟后你会看到类似如下的结果:

1
2
3
4
5
6
7
8
9
10
key 577F4A22 marked as ultimately trusted
public and secret key created and signed.

gpg: checking the trustdb
gpg: 3 marginal(s) needed, 1 complete(s) needed, PGP trust model
gpg: depth: 0 valid: 1 signed: 0 trust: 0-, 0q, 0n, 0m, 0f, 1u
pub 4096R/577F4A22 2015-07-01
Key fingerprint = A573 2A0D 7237 5738 3A41 6A0D 2565 7C7D 577F 4A22
uid Yujiang Bi (Created at 2015.07.01. Old keys are not used.) <byujiang@gmail.com>
sub 4096R/56AE325C 2015-07-01

其中, uid就是用户ID, 577F4A22 也可以用来当作用户ID, 以下用 UID 代替.
接着生成一张"撤销证书", 用来将来密钥作废时,请求外部的公钥服务器撤销你的公钥

1
gpg --output revoke.asc --gen-revoke UID

同样地,确认, 原因, 注释, 密码, revoke.asc就是撤销证书, 好好保存. 不要让别人偷了去了.

管理个人密钥

列出密钥

1
gpg --list-keys

这会列出系统已有密钥,如下:

1
2
3
4
5
/home/dark/.gnupg/pubring.gpg
-----------------------------
pub 4096R/577F4A22 2015-07-01
uid Yujiang Bi (Created at 2015.07.01. Old keys are not used.) <byujiang@gmail.com>
sub 4096R/56AE325C 2015-07-01

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

删除密钥

列出密钥后,可以删除不用的密钥.

1
gpg --delete-key UID

这样就删除了UID这个密钥

输出密钥

公钥文件(.gnupg/pubring.gpg)以二进制形式储存, 可以这样导出到ASCII文本中:

1
gpg --armor --output public.txt --export UID

导出密钥到ASCII文本中:

1
gpg --armor --output private.txt --export-secret-keys UID

上传密钥

公钥服务器是网络上专门储存用户公钥的服务器, 上传到公钥服务器可以让别人导入你的公钥, 进而向你发送加密文件或邮件.

1
gpg --send-keys UID --keyserver hkp://subkeys.pgp.net

这样,你的公钥就上传到了公钥服务器上了, 通过交换机制,所有的公钥服务器最终都会包含你的公钥。由于公钥服务器不会检查上传人的身份, 故需要你将你的公钥指纹发布到网上,确保真实性, 让其他下载你公钥的人可以检验是否为真. 用下面的命令输出你的公钥指纹.

1
gpg --fingerprint UID

我的公钥指纹是

1
2
pub 4096R/577F4A22 2015-07-01
Key fingerprint = A573 2A0D 7237 5738 3A41 6A0D 2565 7C7D 577F 4A22

导入密钥

同样的,你可以从公钥服务器上导入别人的公钥:

1
gpg --keyserver keys.gnupg.net --search-key UID

--search-key 参数可以是邮箱, 或者 uid的名字.
如果准确知道导入公钥的 uid, 可以直接导入

1
gpg --keyserver keys.gnupg.net --rec-key UID

或者让别人直接发给你,然后导入

1
gpg --import [key-file]

确定公钥的真实性后,可以对其签收:

1
gpg --sign-key UID

同样上面也能导入其他的自己的秘钥.

文件加密解密

文件加密

假定加密文件为 file, 加密后的文件为 en-file:

1
gpg --recipient UID --output en-file --encrypt file

UID是接收人的秘钥UID.

文件解密

收到别人给自己的加密文件 file, 可以解密到 de-file

1
gpg --output de-file -d file

不加--output 会直接输出到终端

文件数字签名

对文件签名

有时候我们需要对文件签名,表示这个文件确实是本人发出的, 若有多个秘钥,则需要加上 -u(--local-user) uid

1
gpg [-u UID] --sign file

之后会生成一个file.gpg 的二进制文件, 用--cleansign 代替--sign 会生成 ASCII 文件 file.asc

可以将签名写进另一个文件, 高度推荐这种用法,尤其是对二进制文件(如文档)签名的时候。另外, --armor 选项在这儿也非常有用, 会生成 ASCII 码形式的签名文件, 不加则是二进制的.

1
2
3
gpg [-u UID] --armor --detach-sign file
#or
gpg -a -b [-u UID] file

对文件签名验证

收到别人签名后的文件,需要用对方的公钥验证签名是否为真, 如果没有其公钥,需要先导入.

1
gpg --verify file.asc

如果是签名和文件合在一起,可以使用如下命令提取原始文件:

1
gpg --output file.orig -d file.asc

签名并加密

有时候我们需要签名的时候进行加密,可以这样做:

1
gpg [-u Sender] [-r Recipient] [--armor] --sign [--clearsign] --encrypt [Data]

Sender 是自己的 UID, Recipient 是对方的 UID.

验证签名并解密

如果数据既签名又加密,则验证签名过程是在解密中进行的

1
gpg --output de-file -d file

邮件加密解密

… Absent Now…


水水更健康"o((>ω< ))o"