使用GnuPG(PGP)加密信息及数字签名教程

现在社会,隐私已经成为一个伪命题,我们每年都能看到各种各样的信息泄漏事件,比如网易邮箱泄密,在比如美国的希拉里逃过了FBI逃过了维基解密,却逃不过钓鱼邮件。导致邮件信息外泄。那么我们普通人日常工作中可能也会有一些比较重要的资料需要发送,这个时候,我们如果保障资料发送过去不会被修改、不会被监听?

有的人可能不相信国内的邮箱,以用qq、网易等国内邮箱为耻,喜欢用gmial,但是你可能不知道,其实gmail也不安全,还记得斯诺登的棱镜事件吗?要知道google向美国情报局提供美国公民隐私的哦。当然,天朝也好不到哪里去,抛开这些政治上的因素,我们也不希望自己的信息随随便便的被人拿到拿去从事一些非法的勾当。那么就跟我来学习如何给你的文件、邮件、文本内容进行加密吧!

什么是pgp

它是目前最流行、最好用的加密工具之一。

1991年,程序员Phil Zimmermann为了避开政府监视,开发了加密软件PGP。这个软件非常好用,迅速流传开来,成了许多程序员的必备工具。但是,它是商业软件,不能自由使用。所以,自由软件基金会决定,开发一个PGP的替代品,取名为GnuPG。这就是GPG的由来。
GPG有许多用途,本文主要介绍邮件的加密,不同的邮件客户端有不同的设置。

安装

brew install Caskroom/cask/gpgtools

或者去官网下载

使用

查看帮助

gpg --help

生成签名

gpg --gen-key

运行后会要求进行一些设置

第一步,设置签名的算法,默认是rsa

 gpg (GnuPG/MacGPG2) 2.0.30; 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.

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

然后是设置签名的长度

RSA keys may be between 1024 and 4096 bits long.
What keysize do you want? (2048) 4096
Requested keysize is 4096 bits

设置签名的过期时间,0为永不过期

Please specify how long the key should be valid.
         0 = key does not expire
      <n>  = key expires in n days
      <n>w = key expires in n weeks
      <n>m = key expires in n months
      <n>y = key expires in n years
Key is valid for? (0)
Key does not expire at all

确认信息输入y

Is this correct? (y/N) y

GnuPG needs to construct a user ID to identify your key.

设置名称

Real name: wenjun.fang

设置自己邮件地址

Email address: [email protected]
Comment:
You selected this USER-ID:
    "wenjun.fang <[email protected]>"

确认无误输入O

Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? O
You need a Passphrase to protect your secret key.

We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard, move the mouse, utilize the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.
We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard, move the mouse, utilize the
disks) during the prime generation; this gives the random number

此时会弹出一个输入密码的对话框,重复输入2次即可

![](https://file.awen.me/blog/2017-08-02-230104.jpg!awen)

最后得到一个签名

generator a better chance to gain enough entropy.
gpg: key 593A11D9 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:   2  signed:   0  trust: 0-, 0q, 0n, 0m, 0f, 2u
pub   4096R/593A11D9 2017-08-02
      Key fingerprint = 6095 B126 B7DC 6FAD C187  9BA6 83BA 4F1D 593A 11D9
uid       [ultimate] wenjun.fang <[email protected]>
sub   4096R/F961C43E 2017-08-02 

查看

gpg --list-keys
/Users/wenjun/.gnupg/pubring.gpg
--------------------------------

pub   4096R/593A11D1 2017-08-02
uid       [ultimate] wenjun.fang <[email protected]>
sub   4096R/F961C43E 2017-08-02

从上面我们需要知道以下信息

pub 是你的公钥信息 其中593A11D1是你的公钥id,uid 是你的名字wenjun.fang

导出公钥

gpg -a –output key.public –export UID

把自己的公钥发布到公共服务器

gpg --keyserver keys.gnupg.net --send-key ID

参数 –search-key 用于指定搜索关键字,可以是uid的名字或者email地址部分。这样其他人搜索你的这个公钥后就可以把要发送给你的邮件内容进行加密然后只有你能解密。

## 导入他人公钥

gpg --keyserver keys.gnupg.net --recv-key 72E75B05

其中72E75B05是其他人的公钥。

 导入公钥还有另一种方法:如果我把公钥文件直接发送了给你,你也可以跳过公钥服务器。下面假设我的公钥文件 key.public 已发送给你,你运行如下命令就可以导入我的公钥了:

gpg --import key.public

核对公钥的指纹值并签收公钥

 把对方的公钥导入到本机后,就已经可以用它来加密信息或者用于校验我的数字签名。不过这样每次操作时都会提示公钥不可信,因为虽然你导入了我的公钥,但存在导入冒充者的公钥的可能性。所以你需要进一步跟我核对公钥是否正确,然后签收(sign key)它。

  因为公钥有可能出现冒牌货,所以每个公钥里都加入了指纹值,使用下面命令可以查看指纹值:

gpg --fingerprint

pub   4096R/593A11D1 2017-08-02
      Key fingerprint = 6095 B126 B7DC 6FAD C187  9BA6 83BA 4F1D 593A 11D9 #这就是指纹信息
uid       [ultimate] wenjun.fang <[email protected]>
sub   4096R/F961C43E 2017-08-02

确定取得的公钥是真货之后,使用如下命令对这个公钥进行签收(sign key):

gpg --sign-key ivarptr

运行上面的命令之后它提示你再确认一次指纹值,输入y并按回车确定。

提示,如果发现获取回来的是冒牌货,可以使用如下的命令删除它:

gpg --delete-keys ivarptr

加密一个文件

  使用文本编辑器(比如记事本或者 vim、echo)创建一个名为 message.txt 的文件,里面写上任意一行文字,然后使用如下的命令加密它:

gpg -a –output message-ciper.txt -r [email protected] -e message.txt

其中参数:

-a 表示输出文本文件格式。
–output 指定输出(即加密后)的文件名。
-r 指定信息的接收者(recipient)公钥的uid,可以是名字也可以是email地址。
-e 表示这次要执行的是加密(encrypt)操作。
  执行完毕之后会在当前文件夹产生文件 message-ciper.txt,这个就是被加密之后的文件。

  注:如果你要加密的是一个二进制文件,则可以省略 -a 参数,这样产生的加密文件的体积会小一些。

## 解密一个文件
  现在假设我已经收到你寄过来的加密文件 message-ciper.txt,使用如下的命令解密:

gpg --output message-plain.txt -d message-ciper.txt

其中参数:

–output 指定输出(即解密后)的文件名。
-d 表示这次要执行的是解密(decrypt)操作。
  GnuPG 程序会自动使用我的私钥来解密信息,最后得到一个跟原始内容一样的文本文件 message-plain.txt。

  至此,你已经学会使用 GnuPG 加密解密文件了。

  提示1:导入公钥、核对公钥的指纹值、签名公钥这些操作你只需做一次,以后就可以重复多次使用该公钥加密信息并发送给对方。
提示2:如果你想自己体会整个加密和解密过程,可以用自己的公钥加密信息,然后用自己的私钥解密,只需把上面第3步的命令当中的接收者uid([email protected])更改为自己的uid即可。

数字签名一个文件

gpg -a -b message.txt

其中参数

-a 表示输出文本文件格式。
-b 表示以生成独立的签名文件的方式进行签名。

命令执行完毕之后,会在当前文件夹里产生一个 message.txt.asc 的文件,这个文件即签名。现在我应该把原信息文件 message.txt 连同签名文件 message.txt.asc 一起寄给你,然后你使用如下命令检验:

$ gpg --verify message.txt.asc

如无意外,应该会看到如下两行:

gpg: Signature made Thu 18 Apr 2013 12:35:00 AM CST using RSA key ID 72E75B05
gpg: Good signature from “ivarptr (ivarptr on Twitter) <[email protected]>”

其中最重要的是 “Good signature” 字样,表示通过检验,否则表示没通过检验(即意味着原信息的内容被篡改或者原信息不是我发出的)。
提示:如果你有多个私钥,在签名时需要加上参数 -u 指定私钥的 uid。

以上部分出处参考月光博客

给邮件加密

上面的上传、创建证书其实也可以在图形化解密操作

当你安装完pgp后,会有一些快捷键

我们现在来写一封邮件

选择要加密的内容,然后邮件选择服务,选择OpenPGP:Sign selection 对选中的文本内容进行签名

如果你的系统有多个id,需要选择,并且还要输入密码确认

确认后会看到文件内容已经变了,到这一步其实只是把文件内容签名了,但是真实的文件内容还未加密

然后继续选择签名部分的内容,邮件选择服务–OpenPGP Encrypt Selection

这个时候会要求你选择加密的公钥是谁,也就是你这个邮件是发给谁的你就选择谁的id

另外如图所示的地方也要选择下你自己的签名

最后得到的就是以

-----BEGIN PGP MESSAGE-----

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
=zckI
-----END PGP MESSAGE-----

的文件,然后我们发送

然后对方收到的也是这个邮件

解密也是选择邮件内容 然后邮件选择服务—选择OpenPGP Decrypt selection to new windows 然后会要求你输入密码

就会对文件内容进行解密

mac 加密

只需要安装一个GPGMail 的扩展并且配置gpg密钥

即可加密

只有mac 客户端才能解密并带上签名标识

如果你通过邮件web 端看则是这样的