用免费GPG加密收发Email

GPG即GNU Privacy Guard,它是加密工具PGP(Pretty Good Privacy )的非商业化版本,用于对Email、文件及其他数据的收发进行加密与验证,确保通信数据的可靠性和真实性。本文将对GPG技术及相关工具进行介绍,旨在 帮助网上冲浪者之间“真诚”交流。

一、PGP概述

在介绍GPG前,先让我们看看PGP的基本原理及应用规则。

与许多加密方法一样,PGP使用双密匙来加密数据。每个使用PGP加密技术的人都要创建一对密匙,一个叫做公匙,另一个叫做私匙。公匙可被广泛传播,甚至保存在公共密匙数据库中以被其他Internet用户查阅。私匙属于个人信息,绝不应该泄漏给其他人。

公匙和私匙相互作用对数据进行加密及解密。被公匙加密的数据只能被私匙解密,被私匙加密的数据也只能被一个公匙解密。这样就可以实现双重认证。

用户在发送关键信息给指定人前,首先使用该用户的公匙对信息进行加密。因为只有使用该用户的私匙才能对发送信息进行解密,所以就保证了没有私匙的其他人不会解密信息。

另外,用户也可以使用他的私匙来加密信息,然后发送给许多人。因为只有使用发送者的公匙才能对接收信息进行解密,这样接收者就能确信信息的确来自某个人。

二、获取及安装GPG

前面我们提到,GPG是PGP的非商业版本,也就是免费版本。所以,理解并掌握GPG技术具有很大的实用价值和推广效应。

GPG的下载地址是http://www.gnupg.org/download.html

GPG的当前版本是1.0.6,另外还有一个安全补丁。同时下载这2个文件gnupg-1.0.6.tar.gz和gnupg-1.0.5- 1.0.6.diff.gz,对它们解压缩,安装补丁,运行configure脚本程序进行配置。请注意:默认安装后,配置选项已适用于大多数用户。然 后,运行make、make install安装GPG二进制文件以及其他组件。相关命令如下:

$ tar -xzf gnupg-1.0.4.tar.gz$ cd gnupg-1.0.4$ patch -p1 <../gnupg-1.0.4.security-patch1.diffpatching file g10/mainproc.cpatching file g10/plaintext.cpatching file g10/openfile.c$ ./configure...[ Output of configure ]...$ make...[ Output of make ]...$ suPassword:# make install...[ Output of make install ]...# exit$

三、创建公匙和私匙

在发送或接收加密数据前,首先需要创建一对密匙,即公匙和私匙。我们可以使用如下命令完成创建工作:

$ gpg --gen-key

如果是初次使用GPG,GPG会创建目录$HOME/.gnupg。然后我们必须再次运行这个命令,并依次回答确定PGP列出的一系列问题。对于这些问题,只需简单地选择默认值就可以。下面是相关命令执行情况:

$ gpg --gen-keyPlease select what kind of key you want: (1) DSA and ElGamal (default) (2) DSA (sign only) (4) ElGamal (sign and encrypt)Your selection? 1DSA keypair will have 1024 bits.About to generate a new ELG-E keypair. minimum keysize is 768 bits default keysize is 1024 bits highest suggested keysize is 2048 bitsWhat keysize do you want? (1024) 1024Requested keysize is 1024 bitsPlease specify how long the key should be valid. 0 = key does not expire = key expires in n days w = key expires in n weeks m = key expires in n months y = key expires in n yearsKey is valid for? (0) 0Key does not expire at allIs this correct (y/n)? yYou need a User-ID to identify your key; the softwareconstructs the user id from Real Name, Comment andEmail Address in this form: "Heinrich Heine (Der Dichter) "Real name: Joe UserEmail address: joe@mynet.netComment: PGP Rules!You selected this USER-ID: "Joe User (PGP Rules!) "Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? oYou need a Passphrase to protect your secret key.Enter passphrase:Repeat passphrase:

请注意,在最后输入passphrase时,不要随意设置。建议按照设置口令的一般规则设置passphrase。

进行到这里,GPG将开始创建密匙了。但是你可能会看到下面的信息:

Not enough random bytes available. Please do some otherwork to give the OS a chance to collect more entropy!

这是因为,创建密匙前,GPG还需要一些少量但稳定的随机数信息。在Linux中,通常情况下,GPG从/dev/random设备得到这些随机数,并且最好在系统运行的当前状态下。我们可以通过移动鼠标或者敲打多次Shift、Ctrl键来完成随机数创建工作。

最终,将出现GPG成功创建密匙的信息:

public and secret key created and signed.

四、操作密匙

有关密匙操作的方面包括:密匙列表、密匙导入、密匙导出、密匙签名以及用户信任,下面分别介绍。

1、密匙列表

密匙列表非常重要,获取密匙列表以及其所有者的名称、Email地址的命令及执行情况如下:

$ gpg --list-keys/home/joe/.gnupg/pubring.gpgpub 1024D/D9BAC463 2001-01-03 Joe User (PGP Rules!) sub 1024g/5EE5D252 2001-01-03pub 1024D/4F03BD39 2001-01-15 Mike Socks (I'm WIRED) sub 1024g/FDBB477D 2001-01-15$

输出结果中的每一行包含一个用于加密文件的公匙信息,以及加密数据可被发送的Email地址。

2、密匙的导入和导出

密匙的导入和导出操作在PGP世界中简直就是家常便饭,因为为了安全交换数据,发送者和接收者之间必须首先具有相互的公匙,而实现这个目的就需要密匙的导入和导出。

首先看看如何导出密匙。假设用户是mike,具体的命令是:

$ gpg --export mike@mynet.net >mike.gpg

这样,对于mike@mynet.net的公匙信息就保存到了mike.gpg文件中,然后mike就可用将mykey.gpg传播给朋友、合作伙伴,实 现安全通信。但是这个mike.gpg是一个不可读格式的文件,就是说其内容看起来非常杂乱。能否生成一个标准ASCII码格式的导出密匙文件呢?当然可 以,添加一个“-a”参数就可以,命令如下:

$ gpg -a --export mike@mynet.net >mike.gpg

新mike.gpg具有很好的格式,并包含同样的公匙信息以及常规鉴别字符串。

接着看看如何导入密匙,其模式与导出密匙相似,假设用户是god,命令是:

$ gpg --import mike.gpg

这样,god就可以接收来自mike、经mike的公匙加密的邮件信息了。

3、密匙签名和用户信任

尽管在理论上讲,具备了公匙和私匙就可以实现安全的信息通讯,但是在实际应用中,还必须对公匙进行有效确认。因为,确实存在伪造公匙信息的可能。

由此,在GPG中引入了一个复杂的信任系统,以帮助我们区分哪些密匙是真的,哪些密匙是假的。这个信任系统是基于密匙的,主要包括密匙签名。

当收到熟人的公匙并且GPG告知不存在任何实体可信信息附加于这个公匙后,首要的事情就是对这个密匙进行“指纹采样”(fingerprint)。例如, 我们对来自mike的公匙进行了导入操作,并且GPG告知我们不存在这个密匙的附加可信信息,这时候,我们首先要做的工作就是对这个新密匙进行“指纹采 样”,相关命令及执行情况如下:

$ gpg --fingerprint mike@hairnet.orgpub 1024D/4F03BD39 2001-01-15 Mike Socks (I'm WIRED) Key fingerprint = B121 5431 8DE4 E3A8 4AA7 737D 20BE 0DB8 4F03 BD39sub 1024g/FDBB477D 2001-01-15$

这样,就从密匙数据中生成了其指纹信息,并且应该是唯一的。然后,我们打电话给mike,确认两件事情。首先,他是否发送给我们了密匙;其次,他的公匙的 指纹信息是什么。如果Mike确认了这两件事情,我们就可以确信这个密匙是合法的。接下来,我们对密匙进行签名操作,以表示这个密匙来自Mike而且我们 对密匙的信任,相关命令及执行情况如下:

$ gpg --sign-key mike@hairnet.orgpub 1024D/4F03BD39 created: 2001-01-15 expires: neversub 1024g/FDBB477D created: 2001-01-15 expires: never(1) Mike Socks (I'm WIRED) pub 1024D/4F03BD39 created: 2001-01-15 expires: neverFingerprint = B121 5431 8DE4 E3A8 4AA7 737D 20BE 0DB8 4F03 BD39Mike Socks (I'm WIRED) Are you really sure that you want to sign this keywith your key: "Ima User (I'm just ME) "Really sign? yYou need a passphrase to unlock the secret key foruser: "Ima User (I'm just ME) "1024-bit DSA key, ID D9BAC463, created 2001-01-03Enter passphrase:$

执行到此,使用我们的私匙完成了对Mike的公匙的签名操作,任何持有我们的公匙的人都可以查证签名确实属于我们自己。这个附加到Mike的公匙上的签名 信息将随它环游Internet世界,我们使用个人信誉,也就是我们自己的私匙,保证了那个密匙确实属于Mike。这是一个多么感人的充满诚信的故事啊 :-) 现实世界的人们是否应该从这严格的技术标准中反思些什么呢?

还是回到这里。获取附加于一个公匙上的签名信息列表的命令是:

gpg --check-sigs mike@hairnet.org

签名列表越长,密匙的可信度越大。其实,正是签名系统本身提供了密匙查证功能。假设我们接收到一个签名为Mike的密匙,通过Mike的公匙,我们验证出签名确实属于Mike,那么我们就信任了这个密匙。推而广之,我们就可以信任Mike签名的任何密匙。

为了更加稳妥,GPG还引入了另一个附加功能:可信级别(trust level)。使用它,我们可以为我们拥有的任何密匙的所有者指定可信级别。例如,即使我们知道Mike的公匙是可信的,但是事实上我们不能信任Mike 在对其他密匙签名时的判断;我们会想,Mike也许只对少数密匙进行了签名,但却没有好好地检查一遍。

设置可信级别的命令及执行情况如下:

$ gpg --edit-key mike@hairnet.orgpub 1024D/4F03BD39 created: 2001-01-15 expires: never trust: -/fsub 1024g/FDBB477D created: 2001-01-15 expires: never(1) Mike Socks (I'm WIRED) Command> trust 1 = Don't know 2 = I do NOT trust 3 = I trust marginally 4 = I trust fully s = please show me more information m = back to the main menuYour decision? 2Command> quit$

在命令编辑环境中执行trust,然后选择级别2("I do NOT trust"),这样我们割断了任何信任链,使每个密匙都必须经过Mike的签名。

五、使用GPG收发数据

下面我们开始讨论如何使用GPG收发数据,这是日复一日的工作,一定要理解并熟练。在本文开始的PGP概述部分,我们提到了数据交换的两种方式,现在我们对其分类概念化:

●数据签名传输(Signed data):发送者使用私匙对数据加密,接收者使用公匙对数据解密。

●数据加密传输(Encrypted data):发送者使用公匙对数据加密,接收者使用私匙对数据解密。

以下分别详细介绍。

1、数据签名传输

发送者使用私匙对数据进行签名,接收者拥有发送者的公匙,对之信任并使用它验证接收数据的完整性。对数据进行签名的最简单的方法是使用clearsign命令,这将使GPG创建一个易读的签名,很适于发送Email。具体命令及执行情况如下:

$ gpg --clearsign mymessage.txtYou need a passphrase to unlock the secret key foruser: "Ima User (I'm just ME) "1024-bit DSA key, ID D9BAC463, created 2001-01-15Enter passphrase:$

输入passphrase后,就将生成一个扩展名为.asc的新文件,这里就是mymessage.txt.asc。这个文件包含了mymessage.txt文件的原始内容以及一个如下所示的签名信息:

-----BEGIN PGP SIGNATURE-----

Version: GnuPG v1.0.1 (GNU/Linux)

Comment: For info see http://www.gnupg.org

iD8DBQE6YouhU87DFNm6xGMRAiwqAJ4mnviKz5wA9HFhCW9PG6zl7A2LPACgk0SB

n+yWiCt4SCTVkSSgezGKIUk=

=WnX/

-----END PGP SIGNATURE-----

当接收者收到包含上述签名的信息或文件时,他可以使用发送者的公匙来验证信息的完整性,具体命令及执行情况如下:

$ gpg --verify message.txt.ascgpg: Signature made Sat Jan 13 22:33:21 2001 MST using DSA key D9BAC463gpg: Good signature from "Ima User (I'm just ME) "$

2、数据加密传输

第2种传输方式的目的是为了只让个别人看到发送信息,所谓“信”有独钟。发送者使用其公匙对文件或数据进行加密,接收者使用发送者的私匙对接收数据进行解密。

加密命令包含两个部分,一部分指定接收者的Email,另一部分指定要加密的文件。具体命令如下:

$ gpg -r mike@hairnet.org -a --encrypt message.txt

执行后的输出结果为文件message.txt.asc,其内容类似如下:

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

Version: GnuPG v1.0.1 (GNU/Linux)

Comment: For info see http://www.gnupg.org

hQEOA/Yj7lT9u0d9EAQAhE+KaGfMzvRfCdrfW2EYzuu+YeaKdoJksHB16CO7RsZC

DkllV/uma/rMj5PiDzFoV8PGjqdq9M+n9YXOVnuG3XITWhuvfFqm1KWxK9e0UDoS

7Tb2cm+k8UK18HBI/EaNrV+a3A5YQr6nVY0OCXheohg3+9ursFc8uOBQma64/VUD

/io0EQiIxEmERy2UsN7e+OB1/w4FUcRt7FFWCTVMGdUuQPY8UkeStH7u43NlPsf5

6uPPjaTxCOjjQoCf17XnfxqJPm9c0uyPDjljXYmp74XroT+lHvGcaKK56t0agGVo

i5nMflXoCIA2n/KDALzTjy7cIzLnUeYVU4NrBt7pV4TTyelxYB70mW94Wlr5BlLj

S+FYueR31i790QO+265iS4QPA+zxXIT5KCF8TT1gVPaZOJxmo0wRKuoOYrCd7LQD

Oz3exhCgeKKjfZRwJtqvl/QVamFJWSyhAiuTlA60IHyxIqAZlwLoYoXs9oOIs49g

HLYG6hSemJEW+fTX8xipOOfDXzHrJjUE897igeW62Mf6HLr4aNb1kwrlH7d7Xdr8

29+sckZlSRtBvL3/dSw5FcRCFYbS51AHstdywYvNu4rqSOljv5C6dXEw9Gre+wPS

5S7k0KoTLK4VOZJI2byBTZxgjQNr7ytpu1QMN2+10tpHx6MLkUFV/BJZbAtJ3C0v

auS4xskoSlZgbuX/8Veqhx4GC0lSRLqn14M9CP/tzZN0dIZSTbM2aq58zk0wZZVB

Tmb06HdYvkLrcLkmyNBt3/PUlDIIdeXNCkqN5bjGD/elTtkaMmHN9OIIDHWA9olR

tcXoLJPF4kgg1q6y6pgy2sklYQhI8A4q8VoQNJDzF/SbKvlnGji5HyF6rvKDCF0m

/l0heQEMn4AyFbJ7LZt2zh4i3jSwyV4Ff+tWJD09xaNziKi791FaSBVMxsPhT4SD

w+R75JR/FV0IRpMsy8kdJw/+kejQwCmRqDbm3EHOESCOouxsL8JB39vX+1h32p1b

EdVyQIHZA+TomHsp/y3i+EX52MC8+8XmCukHfT0dCVcnfk2H0hKvFueBkW8Y2JGd

FJZb+CDX33Aapr6FW9CIXvI+1NFOz+cIWVZIYYECnUZe4l3Jikjw3rY2To4E/WUy

MN+ZKsMb6xlhMSoRa9qHWY+S/pp9D8qiqweOLg4cnCjZBZWVOMf4dMcDWNjsW3mX

GgYVmPf52WxvVFtp1yjNbHBu+is8/ZR1P04efD+kOg1WtwpfRdHKQ1o1fn/OxYX1

oP7PVR5BK05HaQYmI0Vlwkcv59RyeYqqOQOiEfL0hEWdGy1gdj0R0eHYuZLnBLfb

SHJ2OtRpcqHuXB27EU3C4OR/N++7ExhG/MNB8WPFb82cbIP8xDF9q+3b73b7myTn

JpAYj4p2ocv9Zf1DH9HHaT7bYD37hvjLlNXe07kYOlMWB9+48meO/o+Yjn5oEj60

wipRdCiP4TUoAwC9EDFED64qLXST9MBycLrc5DwiMYzfdyauiHU3MNhUfErXVaRJ

/5ljtJUGHA/P/ouqbSCleHQ=

=2Sgq

-----END PGP MESSAGE-----

注意:通过以上方式被加密的信息也可以被签名,方法是在上述命令中再加上一个-s参数。

要对上述加密数据进行解密,接收者可以使用—decrypt命令,并指定输出重定向的位置。具体命令及执行情况如下:

$ gpg --decrypt message.txt.asc > message.txtYou need a passphrase to unlock the secret key foruser: "Pipi Socks (I'm WIRED) "1024-bit ELG-E key, ID FDBB477D, created 2001-01-15Enter passphrase:$

接收者输入passphrase后,加密信息就被解密,然后导入到文件message.txt中。

六、结 语

以上介绍了免费加密工具GPG的概念、原理及使用方法,可以看到,整个操作流程都是很容易理解和操作的。我相信,你又掌握了网络世界中和朋友安全沟通的一个方法,那么,就让我们灵活、熟练地使用这个方法,在Internet中更加真实地生活!