历史上,密码曾非常高深莫测。二战时,密码甚至能左右世界局势和人类未来,电影《模拟游戏》就有详尽描写。

但时至今日,密码技术却早已是旧时王谢堂前燕,变得唾手可得。这就像,你永远不知道手中的这块硅片中,上亿的晶体管是如何工作的,但这并不妨碍你愉快地捧着手机刷微博。密码亦如是,如今早已有了简明易懂的现代密码朋克,能让你轻松加密自己的邮件、资料,让天河二号几百年都破解不了:这就是这篇文章里将要提到的工具—— Gnu PG,简称 GPG。

如果你使用 Linux,那么你可能更喜欢黑乎乎的命令行, 这方面早已有了一些教程,如这篇文章。因此,本文主要面向习惯使用图形界面的 Windows 用户。

首先需要安装 GPG 工具。这里我选了能在 Windows 下使用的 GPG4win,它提供了一个好用的图形界面。这是它的下载链接。安装还是常见的套路,但是选择安装组件候须勾上“GPA“。

安装

1. 预备知识

在开始密码朋克之旅前,有必要先介绍一些基础概念,这就是“加密”和“签名”。从一个故事开始吧。

东汉末年,曹操挟天子以令诸侯,迁都许昌,汉献帝不满,将欲除之。故血书衣带诏,欲与董承。然此事若为曹操所知,不堪设想。幸董承自西域寻得三位巧匠,名为 RSA。三位巧匠曰:“吾等有一计,可助公成大事。”于是设计出一种神奇的锁,这锁的制造图纸可以公之于众。但是依照这个图纸造出来的锁,只有他的设计者可以打开,否则纵是鲁班再世也无可奈何。董承遂将造锁之法昭告天下,汉献帝在宫中亦得以闻之,于是便将衣带诏“加密”在这个锁中,带出宫外。

后人为了纪念这三位巧匠,将这种加密算法称为 RSA 算法。造锁之法,可公之于天下,故名为“公钥”;开锁之法,则不可告与外人,故名为“私钥”。因为这种方法用到了“公钥”和“私钥”两个密钥,所以又叫做“公钥加密”。

(以上故事,想都不用想,全是我瞎编的)

总之,在张三给李四写信的时候,若张三想要加密,就要用李四所公开的“公钥”去加密。李四收到之后,再用自己的“私钥”去解密。这就是 GPG 的加密流程。

而“签名”,则起到了一个“盖戳”的作用。张三给李四写信时,在信的结尾盖上一个自己的戳,李四收到的时候就知道,这信肯定的张三写的,不会有假。公章的图样,可以用来验证这个戳的真伪,必须公开出去的,所以被称为“公钥”。但是公章本身,保存在张三本人手中,所以称为“私钥”。

因此,所谓“签名”,就是发信方用自己的“私钥”盖一个戳,接收方用发信方的“公钥”来验证这个戳的真伪。

这样,对于一封密信,“加密”确保其它不被窃听,“签名”则确保其不被伪造,这样就安全了。

在 GPG 中,这些都是通过一些数学手段完成的,具体过程很麻烦,此处不再赘述。

2. 给自己生成一组密钥

安装完毕后,打开 GPA,在菜单栏点击”Keys” –> “New Keys”,然后依次输入自己的名字、邮箱、口令,可生成两组组公钥和私钥,分别用于加密和签名。如图:

密钥生成

生成完毕之后,在密钥上右击,选择“Send keys”,然后确定,就可以把密钥上传至公共服务器。如图:

密钥上传

如下图,点击自己的密钥,下面的信息栏中会有一行“Fingerprint”。这是“密钥指纹”,把它告诉你的朋友,你的朋友就可以利用这个指纹,从公共服务器上下载你的公钥。

密钥指纹

3. 添加朋友的公钥

之前已经提到,若想要给朋友发送密信,须用对方公钥以加密;同时,若要验证一封密信的真伪,也要用对方的公钥以验证密信上的签名。若对方已把自己的公钥上传至公共服务器,且你也已获悉对方的密钥指纹,则可以从公钥服务器上下载该公钥。

例如,我的密钥指纹如下

825F60980FF9E969326439D43288ABE1611BB32F

在开头加上“0x”,写成这样的格式:

0x825F60980FF9E969326439D43288ABE1611BB32F

然后在菜单栏选取“Server” –> “Retrive Keys”,并输入指纹,即可下载公钥。如图

密钥获取

若网络情况不好,下载公钥时软件可能会卡死,稍等片刻即可。

4. 对文本进行操作

4.1 加密和签名

首先点击右上的 Clipboard,然后在下方文本框中输入密信的明文内容。

明文

点击上面的“Encrypt”按钮,选择收信者公钥,然后勾选下面的 “Sign(签名)”,并选中自己的私钥。

加密和签名

确定后,输入口令,文本框中就会出现密文。如图。

密文

把这个密文复制到电子邮件中吧!

4.2 解密和验证

和加密一样,点击 Clipboard。然后,把密文复制到文本框中。如图:

密文

然后,点击“Verify”,GPG 会自动对这封密信进行解密,并且验证其签名。最后,弹出一个对话框,显示验证结果。如图:

验证结果

若结果是“Valid”,则说明签名完全没有问题。

若结果是“Key not valid”,则说明签名是没有任何问题的,只是 GPG 无法判断公钥的可信度,所以可需要处理一下密钥有效性的问题,但这就属于 GPG 应用里面比较高级的部分了。不过,无论如何,这里签名是没问题的!签名是没问题的!签名是没问题的!但是,公钥可能是假的!公钥可能是假的!公钥可能是假的!重要的事情说三遍。

若结果是“Bad”,则须小心,这说明签名无效,这封密信是伪造的。

同时,文本框中还会出现明文。见上图。

5. 对文件进行操作

点击右上角的 File 即可对文件进行加密、解密、签名和验证。具体过程和文本类似。