走向隐私——GnuPG简单教程
GNU Privacy Guard(GnuPG 或 GPG)是一个密码学软件,用于加密、签名通信内容及管理非对称密码学的密钥。GnuPG 是自由软件,遵循 IETF 订定的 OpenPGP 技术标准设计,并与 PGP 保持兼容。
–Wikipedia
工作原理
说到加密,我们往往会想起的是给文档或者压缩包设置一个读取密码。这种加密确实是一种廉价又不失安全性的加密方案。加密后的文件可以通过互联网传输,而读取文件的密码则可以通过其他较为安全的方式传递。在计算机科学中,把以密码为基础的加密称为“对称式加密”,即用什么加密的就用什么解密。
然而,这种加密方式也存在很大的问题。一个比较轻的问题是,利用这种途径加密的文件,其密码可以通过电脑暴力尝试来破解。只要有足够的利益驱使,且密码比较简单,可以在几天之内完成破译。一个最为严重的问题是,通过密码来加密的文件,其密码也需要传递。而如果有什么希望破译文件的第三方能获取到密码,就一定能打开文件。此外还有:如果文件被中途破译并修改再重新加密,密码加密也无法显示文件是否被篡改;如果文件被错误地发送或者发送者想要撤回,则基本上没有可行的方式。
这个时候,几位来自美国的程序员开发了PGP加密技术。这项加密技术旨在实现零密钥交换的通用信息加密——“非对称加密”。
所谓的非对称加密,可以理解为,不再用同一个密码进行加密和解密两套操作。而是用第一串密码(公钥)加密,再用和它有配对关系的第二串密码(私钥)解密。这当中涉及一些复杂的密码学原理,但总之,可以理解为通过一些数学方法,计算机科学家实现了能够产生“一对”密码(密钥对)的方法来实现上述功能。
这样一来,信息的加密就迎来了颠覆。小明想要小红发送一份文件给自己,那么,小明就把自己的公钥发送给小红。小红拿到了公钥,在自己的设备上用小明的公钥加密一份文件。此时,加密出来的文件只能用小明自己的私钥才能解密,如果加密时没有设置,别说什么第三方了,就是小红自己也无法解密。在整个信息传递过程中,让我们回忆一下在互联网上过去了什么信息:一份来自小明的小明的公钥、一份来自小红的已经经过加密的文件。而至关重要的,能够解密文件的那个私钥则始终安然躺在小明的电脑里,从未在网上传递。在第三方视角,那份加密文件就是不可解密的。
可以说,上述过程是所有非对称加密的基本原理,实际会有一些偏差。譬如使用私钥加密而公钥解密的情况也大有出现,而且为了避免诸如“公钥欺诈”的破译手段还要做一些额外的信息交换等等。并且,在任何一个真正的非对称加密应用程序中,“既然追求保密,那就贯彻到底”,为了防止可能的暴力破解,密钥对里的公钥和私钥都是一个巨长的字符串,暴力破解的时间要到20年往上了。
此外,非对称加密还有一些别的好处。还是小明和小红,小红可以选择在给小明加密文件的同时用自己的私钥给文件附上一份签名,使得文件内容一旦修改,小明的客户端就能提示。如果小明收到文件后意外地把私钥泄漏到了公开互联网上,他还可以使用吊销证书来吊销密钥对,此时所有的用小明公钥加密的文件将永远无法通过任何方式来解开了。
不过,简单的非对称加密也不是万无一失的。之前提到了“公钥欺诈”,就得说说非对称加密的弱点。小明给小红发送了自己的公钥,这个公钥最终还是要从网络上走的。如果网络流量本身没有被加密和防篡改,那第三方可以将小明的公钥篡改为那个第三方的公钥,不明真相的小红拿到公钥后用它给那个所谓的小明,实际上是第三方加密了文件,然后再通过网络回传给小明。此时那个第三方再次截获那个已经加密的文件,用自己的私钥就可以解密了。通过“公钥欺诈”,第三方成功破译了加密文件。
但是,对于进阶的非对称加密使用者,第三方的这种把戏终究是愚蠢的。因为在这个时候,小明也收到了小红发的那个加密的文件,并开始用自己的私钥来解密——结果是无法解密——当然无法解密了,因为它根本不是用小明密钥对里的那个公钥加密的,而是用第三方密钥对里的那个用来欺诈小红的公钥加密的。这个时候小明就会迅速意识到自己遭遇了公钥欺诈。可以去找第三方秋后算账了。
如果只是秋后算账那肯定还不行。高级的非对称加密使用者,会在传送公钥时一并附上“指纹”,“指纹”是对每个公钥的一个唯一的标识符,原理和哈希差不多。小明和小红可以核对双方手上的那个公钥文件的指纹是否一致。只有一致的情况下才进行加密。
经过这种步骤,非对称加密可以说是无懈可击了。现在,从互联网上的TLS到自由软件中的GPG,家家都在使用非对称加密。它们将会创造一个更加安全和隐私的互联网。
而GnuPG则是GNU(GNU Not Unix)计划的一部分,是根据开放的OpenPGP标准编写的一个密码学程序,旨在实现人人易用的非对称加密
环境配置
要使用GPG的最基本功能:加密、解密和签名,那么环境配置是非常简单的。在类Unix操作系统中,由于系统库的很多功能组件都倚赖于GPG,它们往往已经预装了GPG程序。打开Terminal,输入gpg --version
并检查返回的结果。
对于初级Linux用户,KDE社区提供了一个GPG的用户界面客户端——Kleopatra,它极大的简化了GPG的操作,非常适合用作教程。这个程序在Windows上也同样可用。请直接访问您Linux的应用商店安装Kleopatra.
GPG4Win是为Windows用户准备的一个完全GPG套件,其中包含了GPG的常用程序:GPG本体、Kleopatra和Gpg Privacy Assistant等等。
图形化使用教程
创建第一个密钥对
本文以Kleopatra为例,介绍如何使用GPG的图形化界面。其他图形化界面的使用大同小异。
首先,初次打开软件,应该看到这个页面:
请点击“新建密钥对”按钮,以开始创建您的第一个密钥对。
要创建第一个密钥对,需要填写一些必要的信息。请在名字一栏填上您的名字(不必真实,但要可供辨认)以及电子邮件地址(作为公钥的一部分,它将被公开,所以确保拥有足够的防范垃圾邮件的措施).完成后点击“OK”按钮开始密钥对生成。
我的电脑中有用于短时间内生成大量随机数的专用芯片,所以这个过程很快就结束了。然而,对于不具备相关芯片的电脑,生成时需要大量的随机数,请随机地移动您的鼠标。这是利用独立个体的不确定性来给电脑创造真正的“绝对随机数”。
现在您已经拥有了第一个GPG密钥对。注意:这个密钥对是存在有效期的,这可以提升安全性。这也意味着GPG是时间敏感的加密算法,请在使用GPG时确保您的计算机时间和NTP时间差距在1秒以下。
导入别人的公钥
为了给别人加密文件(还记得原理吗?不记得了往前翻),我们需要拿到他的公钥。由于我们在本地练习使用,所以请按照刚刚的教程再创建第二个密钥对供练习使用。唯一的区别是由于刚刚已经创建了第一个密钥对,您不能在Kleopatra中简单找到那个按钮,所以请按下Ctrl
+N
按键来新建又一个密钥对。
现在,我已经创建了第二个密钥对:WallumLee。接下来,我会用HelimLee密钥对加密一段文字和一个文件给WallumLee
加密一段文字
生活中最常见的加密需要是加密一段文字。请随便在一个编辑器中输入一段文字,并用光标选中它,按下Ctrl
+C
复制。
接着,打开您的状态栏,找到Kleopatra标志性的红帽小人图标,右键它并依次选择,“剪切板”“加密”。将弹出这样一个页面
请点击“添加收件人”。我们的收件人是刚刚创建的Wallum Lee,所以选择那个密钥对。
确认选择正确后点击“OK”。注意,在某些情况下,我们可能希望也为自己加密一份文件,这时可以按住Ctrl
键并用鼠标选择多个证书。
点击“下一个”按钮。经过一段时间会显示这个页面。
点击“确定”按键,这时,您的剪贴板内容会被替换成这样的字符串:
-----BEGIN PGP MESSAGE-----
hF4Dcln9O/BWQA0SAQdAFpBc7nkdiZbbQ2HT1owL/eacTyPCPJAZWXBvXpi34yQw
MAZ+t5mIuj1IdenSblTKk4EoC+MlXtHzH7NyybVdBJekEqbCVe5G1KuOjXAtMHHU
1FUBCQIQGkMhy3GqDrJjAb12khE8IgEVGtC55ySFpd18/yAnbFfO5/jx+hBLNN9+
4lqX3nsQMME49Is17XuWHMEt/7skhy2/hkT2/q+xHNp3IgD+SyhU
=zqxj
-----END PGP MESSAGE-----
这就是被加密过后的信息了。为了验证,请把加密后的字符串选中并复制,再次打开任务栏,右键单击Kleopatra图标-剪切板-解密/校验。并黏贴,您将会发现剪贴板中的内容被替换为了已经解密的字符串。在我的例子中,这串字符是“我是堾荷甃”。
加密文件
加密一段文字只是GnuPG少数情况下的使用例,多数情况下它被用来加密文件。请打开Kleopatra,在菜单中点击“签名/加密”按钮,选择您要加密的文件并确认。您将会看到这个页面
这个页面的信息量比较大,但请不要担心,我将一一解释。
首先是“证明真实性(签名)”一栏。该栏主要用于证明发件人身份(原理是如果收件人的客户端中安装了发件人的公钥,那么可以通过密码学方法,以那个公钥,来验证这个文件是否发自发件人本人),其对文件最终体积的相对影响不大,而且能够有效预防欺诈,应该保持选中。
然后是“加密”一栏,主要选择数据是否要加密、给谁加密。这里需要明确“加密”在GPG中尽管是核心功能,但并不总是必选的。有时内容发布者不希望自己的内容被加密,因为它会被发送给很多人,而且也不包含什么机密——但发布者迫切地希望证明这个内容确实是他自己发的。那么,他就不会勾选“加密”中的选项。“加密”一栏中还可以选择数据要给哪些人加密、要不要给自己加密,等等。但十分不推荐选择“使用密码加密”一项,因为使用了它,GPG就从非对称加密变成了对称加密,那就有些没有意义了。
最后是“输出”一栏,主要选择加密后文件的存放位置和是否要分别加密/签名各个文件。前者很好理解,后者则是因为GPG可以允许您将多个文件加密为一个类似于压缩包的文件。应该看情况而定是否这样做。
在这里,我们这样选择:
接着我们点击“签名/加密”按钮,等待片刻,文件就加密好了!我们可以打开到加密好了的文件的位置,那是一个以GPG作扩展名的文件。双击它,GPG就可以自动解密。
到这里,我们的加密之旅可以说告一段落了!您可以在下面下载我自己的GPG公钥,用以您所希望的加密或核验用途。密钥ID(指纹):CD0F8D80EC3C168D515EFB5391B7CEDC25D5269F