8/15/2008

PGP/GPG 与公钥/私钥,加密/解密

PGP(Pretty Good Privacy)又称为Pretty Good Privacy,它可以用来保护私隐信息。虽然很难统计这个世界上究竟有多少人使用PGP,但Philip Zimmermann作为PGP的设计者,被评为50位Internet上最有影响力的人之一。

以前,PGP是一种邮件加密软件,它被用于保证邮件在传输过程中保证其保密性和身份确凿性(即身份不可冒认)。现在,PGP的应用已经超出邮件范围,在即时通讯、文件下载、论坛等地方都时常看到PGP的踪迹。
------pgp.org.cn

一.PGP是啥?GPG是啥?

PGP么,简单的说,是一款以利用公钥和密钥技术的加密和身份验证软件。
而GPG呢,就是开源的PGP。

二.公钥?密钥?听起来很麻烦啊!

公钥和密钥,是现在密码学的一个发明。以我们生活中的例子来说,公钥相当于你的银行帐号,私钥相当于你的银行存折和银行卡。

公钥,也就是银行帐号,是公开的,让大家都知道,这样可以让别人向你汇钱。

而私钥这个存折呢,是要小心的藏好的,绝对不能满世界乱丢,因为凭它就可以去银行取你的钱呢。

三.那么说PGP和GPG是很NB的加密软件了?

虽 然PGP和GPG有强大的安全性,足够胜任加密软件的功能。但是,严格意义上来说,PGP和GPG的加密功能应该叫做保密功能比较贴切。只把PGP和 GPG当加密软件用,有点大才小用和不方便了,如果只是要加密软件的话,我个人还是比较推荐TrueCrypt这款软件,毕竟TureCrypt在保持了 强大的安全性的同时,不需要好好保护自己的私钥这么麻烦。就那前面的银行帐号的例子来说,你可以天天去银行自己给自己汇款,但是还是直接存钱比较方便不是 么?

那么PGP和GPG的保密性又是啥回事捏?这很好理解。你汇钱给别人的帐号,是希望持有对应帐号银行存折的人才能取,其他的 比如银行保安阿,柜台的工作人员阿,银行里排队排在你后面的人阿,就算经手了你的钱和汇款帐号也不能偷偷摸摸的把对方的钱取出来对不?所谓的保密性,就是 起到这个作用。

四.额,我只是要个加密软件而已,保密性对我没什么用吧?

保密性当然很重要。对于目前整个互联网应用来 说,还是基于帐号+密码的体系的。这是非常脆弱的一种体系。试想如果银行不给你银行卡和存则,而是给你一个帐号和密码,凭这个帐号和密码就能动你的前,你 能放心吗?而且,我们只是租用互联网和互联网上的服务而已,不管是你的isp,你的email服务商,你上的 bbs,甚至管你的一个小小的网管,只要他们高兴,都能看到你在网络上的所有数据。说不定你那个网管还可以边嘲笑你些给你女朋友的email肉麻边帮你修 改里面的错别字呢…………要知道现在我们常用的http,smtp,pop服务都是明文传递你的信息甚至是你的帐号密码的。不信?自己去搜索"外贸邮件不 正常"看看。

而现在的PGP也好,用于安全协议的https、sftp也好,或者说现在大行其道的数字证书也好,都是采用公钥/密钥模 式,把以前明文通信的,如同明信片一样内容,精心的加上了一个只有收件人能打开的信封而已。若果你觉得保密性不重要,那么想想你会把比较个人的信件用人人 都能看到的明信片寄出去吗?

五.听起来有点道理,那么那个"签名"又是啥东西?

其实呢,这个"签名"是英文的直译。我个 人的角度来看,还是理解为手写体的笔迹比较贴切。以那个信件的例子来说,谁都可以自称你给你女朋友写信,签上你的地址,也可以在公共场所以你的名义贴大字 报。那么你的女朋友又是以什么来判断写信的是不是你呢?自然是靠那个别人很难模仿的笔迹。而PGP,或者其他的公钥/密钥系统的软件所产生的签名,就是等 于把原来是印刷体的文字,变成你自己手写的内容。

而用pgp或者数字证书等东西进行签名,其意义就在于,声明某一段文字或者文件是你本人发表的,而且防止别人篡改你的东西。这在bbs等公共场合,有权限的各级管理员可以修改你发布的帖子的内容的时候,特别有用。

六。拿我要验证别人的签名不是要保留一堆公钥?那不是很麻烦?

要是在以前,或许很麻烦,但现在是网络时代,就不用担心这点了。
现在网络上有很多公钥服务器,而且都是互相同步的。比如:

http://keyserver.ubuntu.com:11371
http://pgp.mit.edu/
http://wwwkeys.pgp.net:11371
http://subkeys.pgp.net

只要上这些网站或者在pgp/gpg软件中把公钥同步上去就可以了。

 基本所有的pgp和gpg软件都支持这些全球性的公钥服务器,你也可以建立自己的公钥服务器供小范围使用。

 在这些服务器上,所有的公钥都以一个id来识别。这个id是建立公钥的时候就固定下来的。在常用的pgp软件中都可以查看到。在公布公钥时,只要把公钥发布到这些服务器上,然后交给别人一个id就可以了

 比如我就把我的id放在 http://www.mrxu.net 的最下面,想导入我密钥的人只要在pgp或者gpg软件内搜索我的key的id就可以了。

七.放在服务器上自己去下载?那我怎么知道这是真的还是假的?

这又是个聪明的问题。对于所有的公钥/密钥的软件来说,验证公钥都是非常重要的一步。如果不能验证公钥,那么签名或者加密都不过是自欺欺人而已。那么,现让我们看看常见的数字证书是怎么验证公钥的。


数字证书,是由有足够权威的商业/政府机构作根服务器,对所有发出的数字证书经过验证后进行签名确保其有效。

这个主意不错吧?比如前一阵汶川地震的时候,各种渠道的散尽天良的骗子冒充红十字会的帐号满天飞,那时候我们怎么办?我们还是以够权威的电视/报纸上公布的帐号为主。这就和数字证书的验证方式相同了,以电视台(报纸)这个认证机构CA,对红十字会的帐号(公钥)进行认证。


与数字证书这种偏重商业性的验证方式不同,PGP采用的是一种更细致化的验证方式。当然,pgp也可以实现类似于数字证书的认证方式,但那只是pgp认证方式的用途之一而已。

还 记得你身边的大多朋友是怎么由陌生人变成你可以信赖的人吗?没错,介绍。你父母把你的邻居介绍给你,你的老师把你的同学介绍给你,你的领导把你的同事介绍 给你。而你的邻居,你的同学,你的同事,又介绍他们的朋友给你。前一阵不是流行六度空间理论吗?世界上每两个人可以通过6个人互相之间产生联系。

pgp就是基于这种介绍人体系。

每个公钥可以对其他的公钥进行签名,表示"我和这个人很熟","我听说过这个人","我和它不熟"。

而你又可以对你得到的公钥设定信任程度:极信任 (我自己的其他身份,我父母),完全信任(我的铁哥们,老朋友,老板),勉强信任(我见过几面的朋友),不信任(我听说过而已),我没听说过。

那么,你遇到的公钥就能分为好几种:

A:我自己很熟,听说过的人 (用自己的公钥签名过的公钥)
B:我铁哥们(我完全信任的公钥)
C:我的熟人的熟人(用A的公钥签名过的公钥)
D:铁哥们的熟人(B签名过的公钥)
E:我铁哥们的熟人的听说过的人(用D的公钥签名过的人)
F:我铁哥们的熟人的听说过的人的听说过的人(用E的公钥签名过的人)
PGP公钥能表示的关系比网上那些什么SNS网络有效精确多了吧?

对于ABCDEF这6个人,我想你对他们的信任程度是不同的吧?而根据他们的关系,你也能判断出ABCDEF哪些可以信任,那哪些压根就不熟了吧?但是如果每个钥匙都要你这么确认,你头也要大了吧?没关系,PGP建立了一个方法能让系统自动判断一个签名可以不可以相信。

你对每一个公钥的信任程度,代表你给用这个公钥的人打了个分。

比如,你的铁哥们是80分吧
而公钥的签名,就对应了打几折(8折,5折)

你自己是100分,B是80分,c是64分,D是64分,E是32分,而f就只要可怜的16分了

而系统可以判断,60分或者70分以上的人自动可以信任(还有多个签名的因素)

那么当以后系统遇到60分或70分以上的人,就自动归为可信的了。(数字只是举例)

在这个系统内,如果你完全相信一个权威认真机构的公钥,那么就等同于数字证书的效果了。

这 点上,PGP.COM就开始作这件事了。它作了个keyserver.pgp.com,必须要认证email才能上传公钥,上传后会为公钥加一个有固定期 限的签名,不与别的服务器同步。不过由于email的安全性比PGP要差得多了,我觉得这个意义实在一般,只能作为辅助手段。

对于你这个用户而言,对这个系统不必搞的那么清楚。你只要知道,如果有一个人,你的几个朋友都信任他,那么,你的PGP/gpg也会帮你信任他了。
PGP的信任系统当然比我的描述的复杂,并严谨的多了,可以进行很多很细致的设置。但是,我们不是白话PGP么,大概知道是怎么回事就足够了。


来自:Ubuntu 中文论坛

没有评论: