转载:公匙加密软件PGP

来源:互联网 发布:随机域名生成 编辑:程序博客网 时间:2024/05/24 15:43

公匙加密软件PGP





转载地址:《黑客防线》 2000-2001合订刊(http://www.hacker.com.cn/)



        PGP的英文全称是“Pretty Good Privacy”,这是一个基于RSA公匙加密体系的邮件加密软件。可以用它对你的邮件加密以防止

非授权者阅读,它还能对你的邮件加上数字签名从而使收信人可以确信邮件是你发来的。它让你可以安全地和你从未见过的人们

通讯,事先并不需要任何保密的渠道用来传递密匙。它采用了审慎的密匙管理,一种RSA和传统加密的杂合算法,用于数字签名的

邮件文摘算法,加密前压缩等,还有一个良好的人机工程设计,它的功能强大,有很快的速度,而且它的源代码是免费的。

        实际上PGP的功能还不止上面说的这些,PGP可以用来加密文件,还可以用PGP代替Unencode生成RADIX 64格式(就是

MIME的BASE 64格式)的编码文件。PGP的创始人是美国的Phil Zimmermann。他的创造性在于他把RSA公匙体系的方便和传统

加密体系的高速度结合起来,并且在数字签名和密匙认证管理机制上有巧妙的设计。因此PGP成为几乎最流行的公匙加密软件包。

        PGP是一种供大众使用的加密软件。加密是为了安全,私密权是一种基本人权。在现代社会里,电子邮件和网络上的文件传输

已经成为生活的一部分,邮件的安全问题就日益突出了,大家都知道在Internet上传输的数据是不加密的,如果你自己不保护自己的

信息,第三者就会轻易获得你的隐秘。还有一个问题就是信息认证,如何让收信人确信邮件没有被第三者篡改,就需要数字签名

技术。RSA公匙体系的特点使它非常适合用来满足上述两个要求:保密性(Privacy)和认证性(Authentication)。

        有关RSA算法的详细情况前面已经介绍过了,我们知道,RSA算法就是一种基于大数不可能质因数分解假设的公匙体系。简单

地说就是找两个很大的质数,一个公开给世界,一个不告诉任何人。一个称为“公匙”,另一个叫“私匙”(Public key&Secret key or

Private key)。这两个密匙是互补的,就是说用公匙加密的密文可以用私匙解密,反过来也一样。假设甲要寄信给乙,他们互相知道

对方的公匙。甲就用乙的公匙加密邮件寄出,乙收到后就可以用自己的私匙解密出甲的原文。由于没别人知道乙的私匙所以即使是

甲本人也无法解密那封信,这就解决了信件保密的问题。另一方面由于每个人都知道乙的公匙,他们都可以给乙发信,那么乙就

无法确信是不是甲的来信。由此认证的问题就出现了,这时候数字签名就有用了。

        在说明数字签名前先要解释一下什么是“邮件文摘”(message digest),简单地讲就是对一封邮件用某种算法算出一个最能体现这

封邮件特征的数来,一旦邮件有任何改变这个数都会变化,那么这个数加上作者的名字(实际上在作者的密匙里)还有日期等等,就可以

作为一个签名了。确切地说PGP是用一个128位的二进制数作为“邮件文摘”的,用来产生它的算法叫MD5(message digest 5)。

MD5的提出者是Ron Rivest,PGP中使用的代码是由Colin Plumb编写的,MD5本身是公用软件,所以PGP的法律条款中没有提到

它。MD5是一种单向散列算法,它不像CRC校验码,很难找到一份替代的邮件与原件具有同样的MD5特征值。

        回到数字签名上来,甲用自己的私匙将上述的128位的特征值加密,附加在邮件后,再用乙的公匙将整个邮件加密。(注意这里的

次序,如果先加密再签名的话,别人可以将签名去掉后签上自己的签名,从而篡改了签名)。这样这份密文被乙收到以后,乙用自己

的私匙将邮件解密,得到甲的原文和签名,乙的PGP也从原文计算出一个128位的特征值来和用甲的公匙解密签名所得到的数比较,

如果符合就说明这份邮件确实是甲寄来的。这样两个安全性要求都得到了满足。

        PGP还可以只签名而不加密,这适用于公开发表声明时,声明人为了证实自己的身份(在网络上只能如此了),可以用自己的私匙

签名。这样就可以让收件人能确认发信人的身份,也可以防止发信人抵赖自己的声明。这一点在商业领域有很大的应用前途,它可以

防止发信人抵赖和信件被途中篡改。

        那么为什么说PGP用的是RSA和传统加密的杂合算法呢?因为RSA算法计算量在速度上不适合加密大量数据,所以PGP实际上

用来加密的不是RSA本身,而是采用了一种叫IDEA的传统加密算法。这里先解释一下什么叫传统加密,简单地说就是用一个密匙

加密明文,然后用同样的密匙解密。这种方法的代表是DES(US Federa Data Encryption Standard),也就是乘法加密,它的主要

缺点就是密匙的传递渠道解决不了安全性问题,不适合网络环境邮件加密需要。IDEA是一个有专利的算法,专利持有者是ETH和

一个瑞士公司:(Ascom-TechAC)。非商业用途的IDEA实现不用向他们交纳费用。IDEA的加(解)密速度比RSA快得多,所以实际上

PGP是以一个随机生成密匙(每次加密不同)用IDEA算法对明文加密,然后用RSA算法对该密匙加密。这样收件人同样是用RSA解密

出这个随机密匙,再用IDEA解密邮件本身。这样的链式加密就做到了既有RSA体系的保密性,又有IDEA算法的快捷性。PGP的创意

有一半就在这一点上了,为什么RSA体系70年代就提出来,一直没有推广应用呢?速度太慢!那么PGP创意的另一半在哪儿呢?

下面再谈PGP的密匙管理。

        一个成熟的加密体系必然要有一个成熟的密匙管理机制配套。公匙体制的提出就是为了解决传统加密体系的密匙分配过程难以

保密的缺点。比如网络黑客们常用的手段之一就是“监听”,如果密匙是通过网络传送就太危险了。举个例子:Novell Netware的老版本

中,用户的密码是以明文在线路中传输的,这样监听者轻易就获得了他人的密码。当然Netware 4.1中数据包头的用户密码现在是加

密了。对PGP来说公匙本来就要公开,就没有防监听的问题。但公匙的发布中仍然存在安全性问题,例如公匙的被篡改(Public Key

Tampering),这可能是公匙密码体系中最大的漏洞,因为大多数新手不能很快发现这一点。你必须确信你拿到的公匙属于它看上去

属于的那个人。为了把这个问题说清楚,这里举个例子,然后再说如何正确地用PGP堵住这个漏洞。

        以你和Alice的通信为例,假设你想给Alice发封信,那你必须有Alice的公匙,你从BBS上下载了Alice的公匙,并用它加密了

信件,用Email功能发给了Alice,不幸地,你和Alice都不知道,另一个叫Charlie的用户潜入BBS,把他自己用Alice的名字生成的

密匙对中的公匙替换了Alice的公匙。那你用来发信的公匙就不是Alice而是 Charlie,一切看来都很正常,因为你拿到的公匙的

用户名是:“Alice“。于是Charlie就可以用他手中的私匙来解密你给Alice的信,甚至他还可以用Alice真正的公匙来转发你给Alice的

信,这样谁都不会起疑心,他如果想改动你给Alice的信也没问题。更有甚者,他还可以伪造Alice的签名给你或其他人发信,因为

你们手中的公匙是伪造的,你们会以为真是Alice的来信。

        防止这种情况出现的最好办法是避免让任何其他人有机会篡改公匙,比如直接从Alice手中得到她的公匙,然而当她在千里之外

或无法见到时,这是很困难的。PGP发展了一种公匙介绍机制来解决这个问题。举例来说:如果你和Alice有一个共同的朋友David,

而David知道他手中的Alice的公匙是正确的(关于如何认证公匙,PGP还有一种方法,后面会谈到,这里假设David已经和Alice认证

过她的公匙)。这样David可以用他自己的私匙在Alice的公匙上签名(就是用上面讲的签名方法),表示他担保这个公匙属于Alice。当然

你需要用David的公匙来校验他给你的Alice的公匙,同样David也可以向Alice认证你的公匙,这样David就成为你和Alice之间的“介绍

人”。这样Alice或David就可以放心地把David签过字的Alice的公匙上载到BBS上让你去拿,没人可能去篡改它而不被你发现,即使

是BBS的管理员。这就是从公共渠道传递公匙的安全手段。

        有人会问:那你怎么安全地得到David的公匙呢,这不是个先有鸡还是先有蛋的问题吗?确实有可能你拿到的David的公匙也是假

的,但这就要求这个捣蛋者参与这整个过程,他必须对你们三人都很熟悉,还要策划很久,这种可能性较小。当然,PGP对这种

可能也有预防的建议,那就是由一个大家普遍信任的人或机构担当这个角色。他被称为“密匙侍者”或“认证权威”,每个由他签字的

公匙都被认为是真的,这样大家只要有一份他的公匙就行了,认证这个人的公匙是方便的,因为他广泛提供这个服务,假冒他的

公匙是很困难的,因为他的公匙流传广泛。这样的“权威”适合由非个人控制组织或政府机构充当,现在已经有等级认证制度的机构

存在。

        对于那些非常分散的人们,PGP更赞成使用私人方式的密匙转介方式,因为这样的非官方途径更能反映出人们自然的社会交

往,而且人们也能自由地选择信任的人来介绍。总之和不认识的人们之间的交往一样。每个公匙有至少一个“用户名”(User ID),

请尽量用自己的全名,最好再加上本人的Email地址,以免混淆。

        你所必须遵循的一条规则是:在你使用任何一个公匙之前,一定要首先认证它!无论你受到什么诱惑,当然会有这种诱惑,

你都绝对不要,直接信任一个从公共渠道(尤其是那些看起来保密的)得来的公匙,记得要用熟人介绍的公匙,或者自己与对方亲自

认证。同样你也不要随便为别人签字认证他们的公匙,就和你在现实生活中一样,家里的房门钥匙你是只会交给十分信任的人。

        下面,我讲讲如何通过电话认证密匙。每个密匙有它们自己的标识(keyID),keyID是一个八位十六进制数,两个密匙具有相同

keyID的可能性是几十亿分之一,而且PGP还提供了一种更可靠的标识密匙的方法:“密匙指纹”(key's fingerprint)。每个密匙对应一串

数字(十六个两位十六进制数),这个指纹重复的可能就更微乎其微了。而且任何人无法指定生成一个具有某个指纹的密匙,密匙是

随机生成的,从指纹也无法反推出密匙来。这样你拿到某人的公匙后就可以和他在电话上核对这个指纹,从而认证他的公匙。如果

你无法和Alice通电话,你可以和David通电话认证David的公匙,从而通过David认证了Alice的公匙,这就是直接认证和间接介绍的

结合。

        这样又引出一种方法,就是把不同人签名的自己的公匙收集在一起,发送到公共场合,这样可以希望大部分人至少认识其中一个

人,从而间接认证了你的公匙。同样你签了朋友的公匙后应该寄回给他,这样就可以让他通过你被你的其他朋友所认证。有点意思

吧,和现实社会中人们的交往一样。PGP会自动为你找出你拿到的公匙中有哪些是你的朋友介绍来的,那些是你朋友的朋友介绍来

的,哪些则是朋友的朋友的朋友介绍的......它会帮你把它们分为不同的信任级别,让你参考决定对它们的信任程度。你可以指定某人

有几层转介公匙的能力,这种能力是随着认证的传递而递减的。

       转介认证机制具有传递性,这是个有趣的问题。PGP的作者Phil Zimmermann说过一句话:“信赖不具有传递性;我有个我相信决

不撒谎的朋友。可是他是个认定总统决不撒谎的傻瓜,可很显然我并不认为总统决不撒谎。”

       关于公匙的安全性问题是PGP安全的核心,这里就不细说了。和传统单密匙体系一样,私匙的保密也是决定性的。相对公匙而

言,私匙不存在被篡改的问题,但存在泄露的问题。RSA的私匙是很长的一个数字,用户不可能将它记住,PGP的办法是让用户为

随机生成的RSA私匙指定一个口令(pass phase)。只有通过给出口令才能将私匙释放出来使用,用口令加密私匙的方法其保密程度

和PGP本身是一样的。所以私匙的安全性问题实际上首先是对用户口令的保密。当然私匙文件本身失密也很危险,因为破译者只是

用穷举法试探出你的口令了,虽说很困难但毕竟是损失了一层安全性。在这里只要简单地记住一点,要像任何隐私一样保藏你的私

匙,不要让任何人有机会接触到它,最好只在大脑中保存它,不要写在纸上。

        PGP在安全性问题上的审慎考虑体现在PGP的各个环节。比如每次加密的实际密匙是个随机数,大家都知道计算机是元法产生

真正的随机数的。PGP程序对随机数的产生是很审慎的,关键的随机数像RSA密匙的产生是从用户敲键盘的时间间隔上取得随机数

种子的。对于磁盘上的randseed.bin文件是采用和邮件同样强度加密的。这有效地防止了他人从你的randseed.bin文件中分析出你

的加密实际密匙的规律来。

        这里还要提一下PGP的加密前预压缩处理,PGP内核使用PKZIP算法来压缩加密前的明文。一方面对电子邮件而言,压缩后加

密再经过7位编码密文有可能比明文更短,这就节省了网络传输的时间。另一方面,明文经过压缩,实际上相当于经过一次变换,

信息更加杂乱无章,对明文攻击的抵御能力更强。PGP中使用的PY\ZIP算法是经过原作者同意的。PKZIP算法是一个公认的压缩率

和压缩速度都相当好的压缩算法。



附:GPG在linux下的使用(GnuPG是PGP的开源实现)


操作流程:

1.生成KEY

$gpg --gen-key

2.发布公钥

$gpg --export -a -o filenamepub.asc(导出公钥)
$gpg --export-secret-keys -a -o filenamesec.asc(导出私钥)
$gpg --list-key(列出公钥,记下KEY)

vi ~/.gnupg/gpg.conf

keyserver wwwkeys.nl.pgp.net (添加该行)

$gpg --keyserver wwwkeys.nl.pgp.net --send-keys KEYID (上传公钥到公钥服务器上)

$gpg --search-keys qz_13*********86@163.com (搜索公钥)

$gpg --import filenamepubkey.asc(导入公钥)

3.加密和解密
加密:
$gpg -r "KEYID/UID"  -e fileA.txt (KEYID就是公钥,操作完成生成加密文件fileA.txt.gpg)

解密:
$gpg -o fileA.txt -d fileA.txt.gpg

4.签名

$gpg -s -r "KEYID/UID" -e fileA.txt

$gpg -o fileA.txt -d fileA.txt.gpg

$gpg -b -a fileB.txt (明文签名)
会生成一个签名文件:fileB.txt.asc。将fileB.txt和fileB.txt.asc一起寄出。

$gpg --verify fileB.txt.asc(收件人判断签名)



转载地址:《黑客防线》 2000-2001合订刊(http://www.hacker.com.cn/)




注:

        PGP相关知识的网址:

                    http://www.pgp.cn/Tutorial/

                    https://www.gnupg.org/

                    http://www.ruanyifeng.com/blog/2013/07/gpg.html



0 0
原创粉丝点击