Gentoo Logo

GnuPG Gentoo用户指南

内容:

1.  简介

你能从本指南中得到什么

本指南已经假定你对公钥加密法、加密和数字签名都比较熟悉。如果事实情况不是这样,请跳转到公钥加密法或者,先看一下GnuPG handbook的第2章,之后再回到这里。

本指南将教给你如何安装GnuPG,如何创建密钥对,如何将密钥添加到公钥环当中,如何将你的公钥提交到密钥服务器以及如何签名、加密、验证或者解密你发送或者接受到的消息。你还可以了解到如何对本地计算机上的文件加密,以防止他人读到其中内容。

安装需要的软件

最基本的,你需要emerge gnupg。现在很多应用程序都支持gpg,所以在你的USE变量里加上crypt应该是个不错的主意。如果你想使用支持gnupg的邮件客户端,你可以选择使用pine(emerge pinepgp)、mutt(emerge mutt)、Mozilla Thunderbird(emerge thunderbird)、evolution(一个类似于微软Outlook的GNOME软件),或者KDE自己的Kmail(KMail是kdepim软件包的一部分)。

如果你使用KDE的话,你很可能对Kgpg感兴趣。这个小程序可以帮助你生成密钥对、从ASCII文件导入密钥、对导入的密钥签名,以及帮助你导出密钥还有一些其他功能。

2.  生成密钥并且将密钥加入公钥环

创建密钥

只需运行gpg --gen-key就可以创建自己的密钥了。它在第一次运行时会创建一些文件夹;再次运行可以创建密钥:

代码 2.1: 密钥产生过程

$ gpg --gen-key
gpg (GnuPG) 1.0.7; Copyright (C) 2002 Free Software Foundation, Inc.
This program comes with ABSOLUTELY NO WARRANTY.
This is free software, and you are welcome to redistribute it
under certain conditions. See the file COPYING for details.

Please select what kind of key you want:
   (1) DSA and ElGamal (default)
   (2) DSA (sign only)
   (4) ElGamal (sign and encrypt)
   (5) RSA (sign only)
   Your selection? 1

此时,你可以选择你想使用的密钥的类型。大多数用户会选择默认的DSA和ElGamal类型。接下来就是密钥的大小;需要注意,虽然密钥越大越好,但是可不要对DSA/ElGamal使用大于2048的值。对于普通的电子邮件来说,1024已经足够了。

在指定密钥大小之后,需要指定的是密钥的有效期。在这里,有效期却是越小越好,但是大多数用户会选择一个永远不会过期的密钥,或者指定有效期为2、3年。

代码 2.2: 选择密钥大小

DSA 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 bits
    What keysize do you want? (1024) 2048
Requested keysize is 2048 bits       
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) 0
Key does not expire at all

现在,你需要键入一些你自己的个人信息。如果你想将自己的公钥送给其他人,那么在这里必须使用真实的电子邮件地址。

代码 2.3: 输入用户信息

Is this correct (y/n)? y
                        
You need a User-ID to identify your key; the software constructs the user id
from Real Name, Comment and Email Address in this form:
"Heinrich Heine (Der Dichter) <heinrichh@duesseldorf.de>"

Real name: John Doe
Email address: john@nowhere.someplace.flick
Comment: The Real John Doe
You selected this USER-ID:
"John Doe (The Real John Doe) <john@nowhere.someplace.flick>"

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

Enter passphrase: 

在这儿,请键入你的密码句两次。我推荐你使用一个比较复杂的密码句。因为,如果有人得到你的私钥和密码句,他们就可以发送冒充你的名义签名的消息,从而欺骗所有人相信这个邮件是你发送的。

接下来,GnuPG才会产生你的密钥。动一下鼠标或者在后台播放一个mp3将会加速这个过程,因为这些动作都会帮助产生随机数据。

生成吊销证书

重要: 这个部分非常重要,你必须现在就做!

每当你创建了密钥,你必须同时创建这个密钥的吊销证书。因为,一旦你的密钥发生不测(例如有人得到了你的密钥和密码句),只有你提前这样做了,你才有能力吊销你的密钥使它无效。

代码 2.4: 生成吊销证书

$ gpg --list-keys
/home/humpback/.gnupg/pubring.gpg
---------------------------------
pub  1024D/75447B14 2002-12-08 John Doe (The Real John Doe) <john@nowhere.someplace.flick>
sub  2048g/96D6CDAD 2002-12-08

$ gpg --output revoke.asc --gen-revoke 75447B14

sec  1024D/75447B14 2002-12-08   John Doe (The Real John Doe) <john@nowhere.someplace.flick>

Create a revocation certificate for this key? y
Please select the reason for the revocation:   
  0 = No reason specified
  1 = Key has been compromised
  2 = Key is superseded
  3 = Key is no longer used
  Q = Cancel
(Probably you want to select 1 here)
Your decision? 1
Enter an optional description; end it with an empty line:
> Someone cracked me and got my key and passphrase
>
Reason for revocation: Key has been compromised
Someone cracked me and got my key and passphrase
Is this okay? y

You need a passphrase to unlock the secret key for
user: "John Doe (The Real John Doe) <john@nowhere.someplace.flick>"
1024-bit DSA key, ID 75447B14, created 2002-12-08

ASCII armored output forced.
Revocation certificate created.

Please move it to a medium which you can hide away; if Mallory gets
access to this certificate he can use it to make your key unusable.
It is smart to print this certificate and store it away, just in case
your media become unreadable.  But have some caution:  The print system of
your machine might store the data and make it available to others!

使用gpg --list-keys命令可以列出公钥环中的所有公钥。你可以用它来查看你密钥的ID,然后生成该密钥的吊销证书。现在,推荐你将.gnupg目录和吊销证书(ASCII形式的——revoke.asc)拷贝到比较安全的媒体(两张软盘或者一张CD-R,并且,请将其保存在比较安全的地方)当中。请务必记住,将来你可以使用revoke.asc来吊销密钥使密钥失效。

注意: 如果你想在多个邮件地址中使用同一个密钥,你可以尝试运行gpg --edit-key YOUR_ID并且使用adduid命令。它会询问你想要在第二个ID中使用的名字,电邮地址和注释。

导出密钥

键入gpg --armor --output john.asc --export john@nowhere.someplace.flick来导出你的密钥。任何时候你都可以使用密钥ID或者其他可以唯一确定该密钥的东西(这里我们使用了电子邮件地址)作为参数。John现在得到了john.asc。他可以将这个文件发送给朋友,或者贴到他自己的网页上去,以便人们可以安全的同他通讯。

导入密钥

为了将文件添加到你的公钥环中去,你必须先导入它,并且验证这个密钥的指纹才行。在验证指纹之后,你还需要将它设为有效。

注意: 验证密钥时请务必小心。因为,这是公钥加密法的一个弱点。

现在我们举例将Luis Pinto(我的一位朋友)的公钥加入到我的公钥环之中去。我给他打了个电话并且问到了他这个密钥的指纹之后,我还仔细对照了一下该密钥的指纹和fpr命令的输出结果。我发现这个密钥是真实的,于是才将其添加到我的公钥环之中。这个密钥比较特殊,它将在2003年12月1日过期,所以我被问到是否要将我的签名设置为在同一天失效。

代码 2.5: Importing and signing keys

$ gpg --import luis.asc
gpg: key 462405BB: public key imported
gpg: Total number processed: 1
gpg:               imported: 1
$ gpg --list-keys
/home/humpback/.gnupg/pubring.gpg
---------------------------------
pub  1024D/75447B14 2002-12-08 John Doe (The Real John Doe) <john@nowhere.someplace.flick>
sub  2048g/96D6CDAD 2002-12-08

pub  1024D/462405BB 2002-12-01 Luis Pinto <lmpinto@student.dei.uc.pt>
uid                            Luis Pinto <lmpinto@dei.uc.pt>
sub  4096g/922175B3 2002-12-01 [expires: 2003-12-01]

$ gpg --edit-key lmpinto@dei.uc.pt
gpg (GnuPG) 1.0.7; Copyright (C) 2002 Free Software Foundation, Inc.
This program comes with ABSOLUTELY NO WARRANTY.
This is free software, and you are welcome to redistribute it
under certain conditions. See the file COPYING for details.


gpg: checking the trustdb
gpg: checking at depth 0 signed=0 ot(-/q/n/m/f/u)=0/0/0/0/0/1
pub  1024D/462405BB  created: 2002-12-01 expires: 2003-12-01 trust: -/-
sub  4096g/922175B3  created: 2002-12-01 expires: 2003-12-01
(1)  Luis Pinto <lmpinto@dei.uc.pt>
(2). Luis Pinto <lmpinto@student.dei.uc.pt>

Command> fpr
pub  1024D/462405BB 2002-12-01 Luis Pinto <lmpinto@dei.uc.pt>
             Fingerprint: F056 3697 ADE3 CF98 B80B  8494 0AD3 E57B 4624 05BB
     
Command> sign
Really sign all user IDs? y
                           
pub  1024D/462405BB  created: 2002-12-01 expires: 2003-12-01 trust: -/-
             Fingerprint: F056 3697 ADE3 CF98 B80B  8494 0AD3 E57B 4624 05BB

     Luis Pinto <lmpinto@dei.uc.pt>
     Luis Pinto <lmpinto@student.dei.uc.pt>

This key is due to expire on 2003-12-01.
Do you want your signature to expire at the same time? (Y/n) Y
How carefully have you verified the key you are about to sign actually belongs
to the person named above?  If you don't know what to answer, enter "0".

   (0) I will not answer. (default)
   (1) I have not checked at all.
   (2) I have done casual checking.
   (3) I have done very careful checking.

   Your selection? 3
Are you really sure that you want to sign this key
with your key: "John Doe (The Real John Doe) <john@nowhere.someplace.flick>"

I have checked this key very carefully.

Really sign? y
              
You need a passphrase to unlock the secret key for
user: "John Doe (The Real John Doe) <john@nowhere.someplace.flick>"
1024-bit DSA key, ID 75447B14, created 2002-12-08

Command> check
uid  Luis Pinto <lmpinto@dei.uc.pt>
sig!3       462405BB 2002-12-01   [self-signature]
sig!3       75447B14 2002-12-08   John Doe (The Real John Doe) <john@nowhe
uid  Luis Pinto <lmpinto@student.dei.uc.pt>
sig!3       462405BB 2002-12-01   [self-signature]
sig!3       75447B14 2002-12-08   John Doe (The Real John Doe) <john@nowhe

3.  与密钥服务器交换密钥

向密钥服务器发送密钥

现在你已经拥有了自己的密钥。要是能把它发送到遍布全球的密钥服务器上去就好了。全世界有很多密钥服务器,大多数服务器之间会相互交换密钥。这里我们试着将John Doe的密钥发送到subkeys.pgp.net服务器。这样会用到HTTP协议,所以如果你在进行HTTP通讯的时候需要使用代理的话,别忘了设置它(export http_proxy=http://proxy_host:port/)。用来发送密钥的命令是gpg --keyserver subkeys.pgp.net --keyserver-options honor-http-proxy --send-key 75447B14,其中,75447B14是密钥ID。如果你并不需要HTTP代理,请去掉--keyserver-options honor-http-proxy选项。

你也可以将你签过名的其他人的密钥发送到密钥服务器上去。比如,我们可以将Luis Pinto的密钥送上去。这样的话,那些信任你的密钥的人可以使用你发送上去的签名来同样得信任Luis的密钥。

从密钥服务器取得密钥

现在,我们举例来查找一下Gustavo Felisberto的密钥,并且将这个密钥添加到John Doe的公钥环上去(趁你还没注意到本指南的作者就是Gustavo Felisberto,:))。

代码 3.1: 在密钥服务器上搜索密钥

$ gpg --keyserver subkeys.pgp.net --keyserver-options honor-http-proxy --search-keys humpback@felisberto.net
gpg: searching for "humpback@felisberto.net" from HKP server subkeys.pgp.net
Keys 1-5 of 5 for "humpback@felisberto.net"
(1)Gustavo Felisberto (apt-get install anarchy) <humpback@felisberto.net> 1024
  created 2002-12-06, key B9F2D52A
(2)Gustavo Felisberto <humpback@altavista.net> 1024
  created 1999-08-03, key E97E0B46
(3)Gustavo A.S.R. Felisberto <humpback@altavista.net> 1024
  created 1998-12-10, key B59AB043
(4)Gustavo Adolfo Silva Ribeiro Felisberto <humpback@altavista.net> 1024
  created 1998-08-26, key 39EB133D
(5)Gustavo Adolfo Silva Ribeiro Felisberto <humpback@altavista.net> 1024
  created 1998-06-14, key AE02AF87
  Enter number(s), N)ext, or Q)uit >1
gpg: requesting key B9F2D52A from HKP keyserver subkeys.pgp.net
gpg: key B9F2D52A: public key imported
gpg: Total number processed: 1
gpg:               imported: 1

你可以从服务器的回复上看出,我给这个密钥服务器提交了好几个密钥,但是当前我仅仅使用B9F2D52A。现在,John Doe就可以得到该密钥。并且,如果信任这个密钥的话,他还可以对它签名。

4.  使用GPG代理

什么是GPG代理?

有时使用某个应用程序的时候,你需要非常频繁的使用你的GPG密钥,这就意味着你得多次输入你的密码。相当多的应用程序支持将密码缓存起来方便用户使用。但是,这却不能让缓存的密码在多个程序之间交叉运用(能有多安全阿?)导致很多应用程序都得一遍又一遍得“重新发明轮子”。

PGP代理是个单独的应用程序。GPG用户可以使用它以标准化并且很安全的方式缓存密码。通过它,多个应用程序可以同时并行得使用GPG:如果你在使用某个应用程序的时候输入了密码,其他应用程序可以不一再请求你输入密码也能使用GPG解锁密钥——当然,GPG代理也需要正好配置为允许这样做的话。

Gentoo提供了好些GPG代理程序。软件包app-crypt/gnupg-1.9.*包含了可以被当作示例的一个代理程序,而它也就是我们要在本文中使用的。

安装和配置gpg-agent和pinentry

你需要安装gnupg-1.9.*。这个软件包中包含了gpg-agentpinentrypinentry是gpg-agent用来在图形环境中获取密码的帮助程序。它可以使用gtk+,QT和curses库(取决于你emerge它的时候采用哪个USE旗标)这三种形式来提供一个弹出窗口。

代码 4.1: 安装gpg-agent和pinentry

# emerge \>=gnupg-1.9.20 pinentry

接下来,创建一个叫做~/.gnupg/gpg-agent.conf的文件并且输入如下几行。这几行定义了默认的密码超时时间(比如,30分钟)和用来在第一次取得密码的应用程序(比如,QT版本的pinentry)。

代码 4.2: 编辑~/.gnupg/gpg-agent.conf

pinentry-program /usr/bin/pinentry-qt
no-grab
default-cache-ttl 1800

配置GnuPG,使其在适当的情况下使用这个代理。修改~/.gnupg/gpg.conf并且添加如下几行:

代码 4.3: 配置GnuPG来使用GPG代理

use-agent

到这里,你的系统就(差不多)可以使用GPG代理了。

自动启动GPG代理

如果你使用KDE作为图形环境,编辑/usr/kde/3.x/env/agent-startup.sh(系统范围)或者~/.kde/env/gpgagent.sh(仅本地用户)添加如下命令让KDE自动启动GPG代理:

代码 4.4: 让KDE自动启动GPG代理

eval "$(gpg-agent --daemon)"

如果你使用其他的图形环境,将这一行(就是与上面提到的一样)添加到~/.xinitrc(如果你使用startx的话)或者~/.xsession(如果你使用XDM/GDM/KDM/...的话)。

5.  文档相关操作

加密和签名

假设你有一个文件想送给Luis。你可以对它进行加密、签名或者两者并用。加密意味着只有Luis可以打开它。而签名可以告诉Luis这个文件的的确确是你创建的。

以下三个命令可以做到这些,加密、签名,以及同时进行加密加签名。

代码 5.1: 对文件加密和签名

$ gpg --output doc.gpg --encrypt --recipient lmpinto@dei.uc.pt doc_to_encrypt
$ gpg --output doc.gpg --sign --recipient lmpinto@dei.uc.pt doc_to_sign
$ gpg --output doc.gpg --encrypt --sign --recipient lmpinto@dei.uc.pt doc_to_encrypt_and_sign

这个过程会创建二进制文件。如果你希望创建ASCII文件,只需在命令最开始的地方添加--clearsign选项。

解密和验证签名

假设你收到了一个加密过的文件。用来将其解密的命令是gpg --output document --decrypt encrypted_doc.gpg。这个命令将会解密文档并且验证签名(如果有签名的话)。

不使用密钥的加密和解密

并不使用密钥而仅仅使用密码对文件进行加密也是可以的。因为,密码本身也可以起到和密钥一样的作用——也即所谓的对称加密密钥。你可以使用gpg--symmetric选项进行加密;解密的方法与我们前面提到的方法一致。

代码 5.2: 使用密码加密文件

$ gpg --output document.gpg --symmetric document
(GnuPG将会询问密码并要求再次确认密码)

高级特性

GnuPG还提供了一些非常好的高级特性。为了找出它们,请打开文件~/.gnupg/gpg.conf

代码 5.3: ~/.gnupg/gpg.conf

#keyserver x-hkp://subkeys.pgp.net
#keyserver-options auto-key-retrieve include-disabled include-revoked

找到上面两行并将行头的注释去掉。这样做的话,以后如果GnuPG想要检查签名却不能在本地的公钥环上到所需的公钥的话,它就会连接到密钥服务器subkeys.pgp.net并尝试从其上取得密钥。

还有一个很好的命令就是gpg --refresh-keys。它会与配置文件中定义好的密钥服务器进行通讯,并且根据得到的信息更新本地的公钥环。它可以查找已经被吊销的密钥、新的ID和某密钥上新的签名。只需每个月运行它一两次,你就能知道是不是有人吊销了他的密钥。

6.  GnuPG的接口

关于电子邮件的签名

大约95%的时间下你会使用GnuPG和电子电子邮件打交道,对你要送出的消息进行签名/加密,还有阅读那些签过名/加密了的消息。所以,让我先来谈谈它们没有问题吧。

通过GnuPG有两种方法给电子邮件签名/加密,新的和旧的:)。采用旧方法的话,消息会以纯文本的形式呈现,并且不能再排版,而且这种方法也不会对附件进行签名和加密。这里就有一个通过旧方法对消息进行签名的例子:

代码 6.1: 纯文本签名

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Test message

-----BEGIN PGP SIGNATURE-----
Version: PGPfreeware 6.5.8 for non-commercial use

iQA/AwUBP8461jMX0745gR7AEQIEOwCg011GbufXO3ED3FkLWXmfzg7xm1cAoJD0
0EU3Kd2EKNCqataEqM5qjpPs
=LchZ
-----END PGP SIGNATURE-----

对于现在这个——又有很好的GUI又支持HTML的邮件阅读器随处可见的——世界来说,通过这种方式加密的消息已经太落后了。

为了解决这个问题,GnuPG增加了对MIME(Multipurpose Internet Mail Extensions)的支持。它会在电子邮件中增加一个域,这个域可以告诉邮件阅读器,整个消息的内容都是签名或者/和加密的。但并非所有的邮件阅读器都支持这种方法,甚至有些阅读器干脆会将整个内容搞乱,微软的Outlook就是其中很有名的代表。

Kgpg

Kgpg是个挺不错的GnuPG的图形界面程序。在主界面里,你可以粘贴想要签名或者加密的文本,当然,你也可以贴上ASCII形式的需要解密的文本。


图示 6.1

Fig. 1: kgpg主窗口

在这张图中,你可以看到贴上了ASCII形式的加密文本的Kgpg的主界面。在这里你可以对它进行解密(你得提供你的密码句)、或者加密其他文件、粘贴新的文本并对其签名等等。


图示 6.2

Fig. 2: kgpg密钥管理窗口

这是密钥管理窗口。在这里你可以看到John Doe的密钥是没有问题的。还有Gustavo和Luis的也是可以信任的,还有Daniel Robbins的密钥还存在问题(我还没来得及给他打个电话确认一下他的密钥指纹:))。

Seahorse

Seahores的目标是为Gnome桌面提供一个GnuPG的图形界面程序。这个软件发展的很快,但是它仍然缺乏一些可以在Kgpg或者命令行版本中找到的特性。

Enigmail

Enigmail是Mozilla-based电子邮件客户端程序(比如,Thunderbird和Seamonkey)的插件。在Seamonkey中,只需到Preferences -> Privacy & Security -> Enigmail中,并在这个界面中输入你的电子邮件地址就好了。对Thunderbird来说,你必须先emerge enigmail才能使用它。然后你还需要到Edit -> Account Settings -> OpenPGP Security才能配置它。

那些pgp或者gpg签名有问题的邮件会被标记上一支折断的笔。而那些有良好签名的邮件则会标记上一支好的笔。Enigmail甚至还可以到密钥服务器上去取得密钥,但是如果遇到什么问题,它则会打印出一些奇怪的消息出来(不过你还记得如何使用命令行,对吧?)。

KMail

如果你在USE旗标中设置了crytp,KMail就会以支持gpg的方式进行编译。这样它就可以自动得加密和解密包含了PGP的邮件,当然,也可以用OpenPGP/MIME的方式对邮件进行加密。如果你还想解密OpenPGP/MIME邮件(当然想吧),你得运行某个GPG代理(参看使用GPG代理)。

Settings, Configure KMail, Security, Crypto Backends去查看KMail是否被配置好了。你会看到一个基于GpgEM后端的列表,并且你应当还可以选择OpenPGP勾选框。如果你能够看到列表,但是列表却是灰色的不能被选择,点一下Rescan。如果这个列表仍然还是灰色的,那么KMail可能还不能正常工作。

如果你还是不能让KMail动起来,请参考KMail PGP HowTo页面获取更多信息。

Claws-Mail

这个邮件阅读器对于大邮箱来说非常快,同时它还有很多好特性,并且,它还可以与gpg配合起来很好得工作。唯一的问题是,它并不支持旧的PGP签名,所以,当你收到此类邮件的时候,你就得手动检查签名了。

只需到账户设置的隐私选项卡里去配置一下,你就可以通过Claws-Mail来使用你的gpg密钥了。在那,Claws-Mail可能已经帮你选择了使用某个密钥,可能大多数用户需要的正是这个默认的密钥吧。

7.  公钥加密法

公钥加密法的基础

公钥加密法的概念最初是由Whitfield Diffie和Martin Hellman在1976年提出的。当我第一次在同一句话里听到“公钥”和“密码学”的时候是1993年,当时我在脑海中的就认为,这简直就是扯淡。那时候也没有互联网(好吧,那时候有,但却不是给我用的),所以我只能去图书馆查找密码学的书。嘿,我要说,那时候我只有16岁,图书管理员用惊讶的眼神看着我却只拿给我一本写给孩子看的替代法加密(就是像著名的凯撒暗号或者ROT-13—Tragbb Ebpxf, naq lbh xabj vg vf tbbq orpnhfr lbh ner ernqvat guvf qbp(如果你根本读不懂前面那句鸟语的话,敬请emerge rotix)那样的方法,将一个字母换作另一个字母)的书。这事儿让我觉得很沮丧,于是开始寻找更多的信息。家里有好几位数学家这事儿再好不过了,因为当我跟他们其中一位谈到这些的时候,我就立即进入了新的世界。

现在,让我们来玩点数学:

代码 7.1: 数学概念

定义:

1——质数是一个大于1的并且只能被1和它自己整除(余数为0)的正整数。
头8个质数是2,3,5,7,11,13,17,19。

定理(此处不给出证明)
1——对于任何合数,我们可以把它分解质因数,且结果唯一。
4=2*2
6=2*3
8=2*4=2*2*2
10=2*5
12=2*6=2*2*3

“事实”:
1——求两个大整数的积很容易
2——对于一个合数分解质因数很困难

假设我给你一个数35,并且说这个数是两个质数的乘积,很容易找出这个这两个数就是5和7。但是如果同样的问题,我给出1588522601,你得花很多时间(或者CPU周期)来计算才能知道它们是49811*31891。不但如此,如果这个数真的真的非常大,这个任务就会变成“不可能完成”的任务。所以,现在如果我告诉全世界一个很大的数,并且说它是两个质数的积,但是我却有关于这个大数的其他一些信息,而这些信息除了我以外其他任何人都不知道。

这就是现代的公钥加密法的基础。举个例子(虽然不够完美),我给了所有人这个大数,并且,某人采用这个数对发送给我的消息进行了加密。虽然所有人都可以读到加密好的消息,但是因为只有我才知道如何读取这个消息的捷径。而其他人却必须“分解”这个大数才能解密这个消息。但是,一个重要的“事实”是,在一个较短的时间(采用最先进的算法并且使用全世界最快的计算机可能需要花数千年)内根本无法正确得拆分这个大数。这样的设计中,那两个大质数被称为“私钥”,而那个很大“合数”就是公钥。

虽然,在实践中,这个例子并不是100%与现实精确对应,但是它给新手提供了一个大致的概念。查看Wikipedia上的Diffie-Hellman协议,可以得到更多与此相关的信息。如果你想更加深入的理解这个主题,就去公共图书馆抓一本Alfred J. Menezes,Paul C. van Oorschot和Scott A. Vanstone合著的"Handbook of Applied Cryptography"。上面这个网站上还有这本书的免费版本。

以上过程还会导致另一个结果,那就是,如果你加密了一个消息送给我,但你自己却不小心把原来没有加密的消息弄丢了,那你就再也不能从已经加密的版本中将原始消息找回来了(译注:这个世界上只有我可以解密,:))。

签名

我们已经看到如果有人有我的公钥,他就可以送给我加密消息。但是,我们如何才能知道邮件的作者真的就是如他自称的那样丝毫不差呢?或者,换个说法,如果我收到了一封来自你的邮件,我怎么能够确信的确是你写给我的而不是别人冒充你的名义写的呢?

还记得公钥加密法不像我上面说的那样简单吗?这个精巧的所在就是,当你将一封邮件加密并且使用你的私钥对其进行了签名,那么,当我收到它的时候,我就可以使用你的公钥来检查签名,然后使用我自己的私钥来解密这封邮件。你会发现,如果使用我之前描述的设计,我们根本无法做到这一点。

给消息签名是非常重要的,这样你就不一定通过对消息进行加密以保证消息的完整性了。这样,你就可以创建一封能够被任何人读到的消息,但是这封邮件却打上了你的“烙印”。而且,这封邮件中哪怕只有一个字母被动过了,都可以(而且将会)被检测的到。

密钥服务器和密钥的签名

假设,直到我收到你的邮件之前,我从来都没有跟你联络过。我怎么才能得到你的公钥,还有,我怎样才能得知那就是你呢?

为了解决这个问题,密钥服务器应运而生。一旦你创建了自己的密钥对(公钥和私钥),并且将公钥发送到了密钥服务器。自此以后,所有人都可以从服务器上得到你的公钥。这就解决了查找密钥的问题。但是,如何知道这个密钥就是作者的密钥则仍然是个问题。为了解决这个问题,我们必须引入另外一个概念,即,密钥签名:

密钥签名的意思是,如果我持有别人的公钥并且我非常肯定这个公钥就是他的公钥(他可能是我的朋友,或者其他我在现实生活中认识的人等等),我就可以为这个公钥签名,并且将它发送到密钥服务器上去。通过这种方式,我就是告诉全世界:“这个公钥的的确确属于公钥其中自称的那个人”。这样的话,那些拥有我的公钥并且信任我的人就可以使用这种信任关系来信任其他人了。

这听起来可能有些晕,让我们看看真实的例子吧。

让我来看一看这3个人的例子:John、Mary和Lisa。John是Mary的好朋友,但是他却不认识Lisa;Lisa也是Mary的朋友,但她同样也不认识John。有一天,Lisa发送给John一封签了名的邮件。John可以从密钥服务器上取得Lisa的公钥来检查这封邮件。如果检查结果是OK的,接着他会看看这个公钥是不是的确是写这封信的人创建的。但是,他如何才能知道她真的就是信中声称的那个人呢?

他会发现,这个密钥已经被Mary签过名了,他之所以能够检查这个结果是因为他拥有Mary的密钥并且他信任Mary的密钥。通过这种信任关系环,他就能更加确信这封邮件正是Lisa写的。

现在,你可以开始使用本指南了。让我们回到第一章开始学习如何使用gpg吧。

8.  写在最后和鸣谢

一些问题

我遇到了一些与带照片的密钥相关的问题。请检查以下你的软件版本。如果你使用的是GnuPG 1.2.1-r1或者以上版本,那应该没什么问题,只有比较旧的版本才有此类问题。此外,还有一些密钥服务器不支持带照片的密钥,所以,最好别在密钥中添加照片。

最新版的gnupg似乎不能用gpg --send-keys来发送密钥,本来这个命令可以将在公钥环中的所有公钥都发送到密钥服务器上去。

还漏了点什么

gpg是个非常复杂的工具,除了我上面提到的,它还可以作很多别的事情。本文只是给新用户一些指引。想要深入了解它的话,请看看GnuPG的网站

虽然,我还漏写另外一些工具,比如pgp4pinegpgpineevolution,或者还有一些Windows工具,但是以后我可能会扩展本文。

鸣谢

John Michael Ashley,他写的 GnuPG Handbook很适合新手看看。

Swift (Sven Vermeulen),他鼓励我写了这篇指南。

#gentoo-doc的所有人,伙计们,你们太酷了。

Tiago Serra,他引领我重新开始研究加密问题。



打印

更新于2010年 6月 13日

本翻译的原始版本已经不再被维护

总结: 这个短小的指南将教给你GnuPG——一个用于安全通讯的工具——的基本用法。。

Gustavo Felisberto
Author

John P. Davis
Editor

Sven Vermeulen
Editor

蒋超
译者

Donate to support our development efforts.

Copyright 2001-2014 Gentoo Foundation, Inc. Questions, Comments? Contact us.