黑客攻防从入门到精通(加密与解密篇)
上QQ阅读APP看书,第一时间看更新

3.4 邮件加密软件PGP详解

PGP(Pretty Good Privacy,更好地保护隐私)是一个基于RSA公钥和私钥及AES等加密算法的加密软件系列。常用的版本是PGP Desktop和Professional(PGP专业桌面版),它包含邮件加密与身份确认,资料公钥和私钥加密,硬盘及移动盘全盘密码保护,网络共享资料加密,PGP自解压文档创建,资料安全擦除等众多功能。由于赛门铁克公司的收购影响,PGP从10.0.2以后,将不再单独放出PGP版本的独立安装包形式,将会以安全插件等形式集成于诺顿等赛门铁克公司安全产品里。

3.4.1 认识PGP

PGP是一个基于RSA公钥加密体系的邮件加密软件,可以用它对邮件保密以防止非授权者阅读,它还能对邮件加上数字签名从而使收信人可以确认邮件的发送者,并能确信邮件没有被篡改。它可以提供一种安全的通信方式,而事先并不需要任何保密的渠道用来传递密钥。它采用了一种RSA和传统加密的杂合算法,用于数字签名的邮件文摘算法,加密前压缩等,还有一个良好的人机工程设计。它的功能强大,有很快的速度。而且它的源代码是免费的。

使用PGP加密算法可以安全地和从未见过的网友彼此进行电子邮件通信,并不需要任何保密的通道用来传递密钥。它采用了审慎的密钥管理,即一种RSA和传统加密的杂合算法,用于数字签名的邮件文摘算法、加密前压缩等。实际上,使用PGP还可以用来加密文件,也可以用PGP生成RADIX 64格式的编码文件。

邮件本身的安全,先要保证邮件来自非法用户窃取或更改,同时接收者也必须能确定该邮件是由合法发送者发出的。可以使用公用密钥系统来达到这个目的。

在实际使用中,用户自己持有一把钥匙,称为私钥,将另一把钥匙公开,这把钥匙称为公钥。当用户向外发送邮件时,先使用一种单向分解函数从邮件中得到固定长度的分解值,该值与邮件的内容相关,称为该邮件的指纹,然后使用自己的密钥对指纹进行加密。

接受者能使用自己的公钥进行解密,然后重新生成指纹进行比较,这保证邮件是由本人发送而非假冒别人的名义,同时也保证邮件在发送过程中没有被更改,这个过程称为数字签名和核实。也可以使用接收者的公钥进行加密,这就保证了只有拥有对应密钥的接收者,才能通过进行解密来得到电子邮件的明文信息。

在现代社会里,电子邮件和网络上的文件传输已成为生活中不可缺少的重要内容,由于在Internet上传输的数据都是公开的,如果自己不保护自己的信息,第三者就会轻易获得私密的信息。还有一个问题就是信息认证,如何让收信人确信邮件没有被第三者篡改,就需要数字签名技术。RSA公钥体系的特点使它非常满足上述两个要求:保密性和认证性。

RSA(Rivest Shamir Adleman)算法是一种基于大数不可能质因数分解假设的公钥体系,简单地说就是找两个很大的质数,一个公开,一个不公开。一个称为“公钥”,另一个称为“私钥”。这两个密钥是互补的,就是说用公钥加密的密文可以用私钥解密,反过来也一样。

假设甲要寄信给乙,互相知道对方的公钥。甲就用乙的公钥加密邮件寄出,乙在收到邮件之后,就可以用自己的私钥解密出甲的原文。由于乙的私钥是保密的,所以即使是甲本人,也无法解密那封信,这就解决了信件保密的问题。另一方面,由于每个人都知道乙的公钥,都可以给乙发信,那么乙就无法确信是不是甲的来信。这时候认证的问题就出现了,就需要用到数字签名了。

在说明数字签名前先要解释一下“邮件文摘”(Message Digest)的问题,即对一封邮件用某种算法算出一个最能体现这封邮件特征的数,一旦邮件有任何改变这个数都会变化,那么这个数加上作者的名字,还有日期等,就可以作为一个签名了。

确切地说,PGP是用一个128位的二进制数作为“邮件文摘”的,用来产生它的算法叫MD5(MD5本身是公用软件)。MD5是一种单向散列算法,它不像CRC校验码,很难找到一份替代的邮件与原件具有同样的MD5特征值。

再来讲一下数字签名,当甲在用自己的私钥将上述128位的特征值加密,并附加在邮件之后,再用乙的公钥将整个邮件加密。这样,当这份密文被乙收到之后,乙就需要自己的私钥将邮件解密,来得到甲的原文和签名。此时,乙的PGP也从原文计算出一个128位的特征值,来和用甲的公钥解密签名所得到的数比较,如果符合就说明这份邮件确实是甲寄来的。这样两个安全性要求都得到了满足。

PGP还可以只签名而不加密,这适用于公开发表声明时,声明人为了证实自己的身份,可以用自己的私钥签名。这样就可以让收件人能确认发信人的身份,也可以防止发信人抵赖自己的声明。这一点在商业领域有很大的应用前途,可以防止发信人抵赖和信件被途中篡改。

3.4.2 PGP邮件加密软件的原理

PGP加密系统是采用公开密钥加密与传统密钥加密相结合的一种加密技术。它使用一对数学上相关的钥匙,其中一个(公钥)用来加密信息,另一个(私钥)用来解密信息。

PGP采用的传统加密技术部分所使用的密钥称为“会话密钥”(sek)。每次使用时,PGP都随机产生一个128位的IDEA会话密钥,用来加密报文。公开密钥加密技术中的公钥和私钥则用来加密会话密钥,并通过它间接地保护报文内容。

PGP中的每个公钥和私钥都伴随着一个密钥证书。它一般包含以下内容。

① 密钥内容(用长达百位的大数字表示的密钥)。

② 密钥类型(表示该密钥为公钥还是私钥)。

③ 密钥长度(密钥的长度,以二进制位表示)。

④ 密钥编号(用以唯一标识该密钥)。

⑤ 创建时间。

⑥ 用户标识(密钥创建人的信息,如姓名、电子邮件等)。

⑦ 密钥指纹(为128位的数字,是密钥内容的提要,表示密钥唯一的特征)。

⑧ 中介人签名(中介人的数字签名,声明该密钥及其所有者的真实性,包括中介人的密钥编号和标识信息)。

⑨ PGP把公钥和私钥存放在密钥环(KEYR)文件中。PGP提供有效的算法查找用户需要的密钥。

⑩ PGP在多处需要用到口令,它主要起到保护私钥的作用。由于私钥太长且无规律,所以难以记忆。PGP把它用口令加密后存入密钥环,这样用户可以用易记的口令间接使用私钥。

⑪ PGP的每个私钥都由一个相应的口令加密。PGP主要在3处需要用户输入口令。

· 需要解开收到的加密信息时,PGP需要用户输入口令,取出私钥解密信息。

· 当用户需要为文件或信息签字时,用户输入口令,取出私钥加密。

· 对磁盘上的文件进行传统加密时,需要用户输入口令。

PGP安全的核心是公钥的安全性,和传统单密钥体系一样,私钥的保密也是具有决定性的。相对公钥而言,私钥不存在被篡改的问题,但存在泄露的问题。

RSA的私钥是一个很长的数字,用户不可能将其记住,PGP的办法是让用户为随机生成的RSA私钥指定一个口令。只有通过给出口令才能将私钥释放出来使用,由于用口令加密私钥方法的保密程度和PGP本身一样,所以私钥的安全性问题,实际上就是对用户口令的保密。当然,私钥文件本身失密也很危险,因为破译者只需要使用穷举法就可以试探出口令了。

PGP在安全性问题上的审慎考虑体现在PGP的各个环节。例如,每次加密的实际密钥是个随机数,大家都知道计算机是无法产生真正的随机数的。PGP程序对随机数的产生是很审慎的,像产生RSA密钥就是从用户敲键盘的时间间隔上取得随机数种子的,而对于磁盘上的Randseed.bin文件,则是采用和邮件同样强度的加密的,这样就有效地防止了他人从Randseed.bin文件中分析出加密实际密钥的规律来。

PGP的加密前预压缩处理,PGP内核使用了PKZIP算法来压缩加密前的明文。一方面,对电子邮件而言,压缩后加密再经过7bits编码密文有可能比明文更短,这就节省了网络传输的时间;另一方面,明文经过压缩,实际上相当于经过一次变换,信息更加杂乱,明文抵御更强。

3.4.3 PGP的安全问题

安全程序的使用不能保证你的通信就是安全的。就算你在房子前门安装一个最安全的锁,小偷仍然可以从开着的窗户爬进来。同样,即使使用了PGP,你的计算机也仍可能很脆弱。

有许多有名的对PGP的攻击,下面的部分就介绍这些攻击。然而,这些绝不是一个完整的清单。将来的攻击很可能会攻破所有的公钥加密技术。这份清单只是让你了解一下保护通信时需要做些什么。

1.蛮力攻击

对PGP最直接的攻击是蛮力攻击使用的密钥。因为PGP 2.6.2使用了两个加密算法,所以要看看这两个算法的安全性。对于公钥加密技术,PGP使用RSA算法;对于私钥加密技术,它使用IDEA。

(1)蛮力攻击RSA密钥

对于RSA密钥,已知最好的蛮力攻击是分解它们。RSA密钥产生时就使得它们难于分解。而且,分解大的数仍然是一门很新的艺术。

最近,最大的一个被分解的RSA密钥是RSA-129,它于1994年4月被分解。RSA-129是在设计RSA算法时于1977年创建的原始RSA提问。它是一个129位的十进制RSA密钥,相当于425位。分解这个数动员了全世界范围的力量,使用了1600台计算机,实际耗费时间超过8个月。

它处理了4600MIPS年的数据,1MIPS年是1MIPS的机器一年所能处理的数据量。例如,一个Pentium 100大约是125MIPS(根据Intel)。如果一个Pentium 100机器为解决一个问题一年时间不停地运行,它就贡献了125MIPS年。按照这种速度,一台机器要花37年才能破解RSA-129。如果使用100台机器,只需要4个月就能破译这个代码,只是实际项目一半的时间。

当前,PGP 2.6.2版使用从512到2048位的密钥。密钥越大,分解越困难。同时,增加密钥长度也会增加使用密钥的时间。从时间来说,据说一个512位的密钥能够给予1年的安全性;访问100台Pentium 100机器要花至少一年才能破译出512位的RSA密钥。如果这是真的,那么一个1024位的密钥,若使用今天最新的算法,假设在技术上没有提高的话,在以后10000年都是安全的。如果技术上有所提高,需要的时间就会少些。然而,看起来技术可能一直在进展。

(2)蛮力攻击IDEA密钥

现在还没听说有人攻击IDEA密钥。最好是尝试2128或3.4×1038个密钥。由于完成这一测试的困难性,尝试破译PGP中用于加密IDEA密钥的RSA密钥更容易。据估计破译IDEA的困难与分解3000位RSA密钥的困难相当。

2.私钥和通过短语

PGP私钥环的安全性基于两件事:对私钥环数据的访问和对用于加密每个私钥的通过短语的了解。使用私钥要拥有这两部分。然而,这也引起了许多攻击。

如果PGP用于多用户系统中,就可能访问私钥环。通过缓存文件,网络窥视或者许多其他的攻击,可以利用监视网络或者读取磁盘得到私钥环。这样就只剩下通过短语用来保护私钥环中的数据了,这就意味着只要获得通过短语就能攻破PGP的安全。

而且,在一个多用户系统中,键盘和CPU之间的链路可能是不安全的。如果有人能够物理上访问连接用户键盘和主机的网络,监视击键是很容易的。例如,用户可能从一群公共的客户终端上登录,这时就可以窥探连接网络得到通过短语。另外,用户还可能通过调制解调器拨叫,在这种情况下窃贼就可以监听键盘击键。在任何一种情况下,在一个多用户的机器上运行PGP都是不安全的。

当然,运行PGP最安全的方法是在一台没有其他人使用而且不联网的个人机上运行;也就是说,一台笔记本或家庭计算机。用户必须在安全环境的代价和安全通信的代价之间找到一种平衡。使用PGP的推荐方法是:总是在安全环境下的安全机器上动用,这样用户就可以控制整个机器。

最好的安全性关键在于键盘和CPU之间的连接是安全的。这既可以通过加密来完成,或者更好一点通过直接、无中断的连接实现。工作站、PC、Mac、膝上型机器都属于安全的机器。

安全的环境更难于显示,这里没有加以探讨。

3.对公钥环的攻击

由于公钥环(公有密钥环)的重要性和对它的依赖性,PGP受到许多针对密钥环的攻击。首先,只有当密钥环改变时才被检查。当添加新的密钥或签名时,PGP验证它们。然而,它会标记密钥环中已检查过的签名,这样就不会再去验证它们。如果有人修改了密钥环,并且设置了签名中相应的位,就不会被检查出来。

对PGP密钥环的另一种攻击集中于PGP使用的进程,它对密钥有效性设置1位。当到达一个密钥的新签名时,PGP就使用前面描述过的信任网络值计算该密钥的有效位。然后PGP在公有密钥环中缓存这个有效位。一个攻击者可能会在密钥环中修改这位,从而迫使用户相信一个无效密钥是有效的。例如,通过设置这个标志,攻击者能够使得用户相信一个密钥属于Alice,尽管没有足够的签名证明这个密钥的有效性。

也可能发生对PGP公钥环的另一种攻击,因为作为介绍人的密钥信任也缓存在公有密钥环中。这个值定义密钥的签名有多少信任度,因此如果使用带有无效参数的密钥签名,就可能使PGP把无效密钥作为有效密钥接受。如果一个密钥被修改为完全受托的介绍人,那么用这个密钥签名的任何密钥都被信任为有效的。因此,一个攻击者如果用一个修改过的密钥为另一个密钥签名,就会使得用户相信它是有效的。

公钥环最大的问题是所有这些位不仅在公钥环中缓存,而且密钥环中没有任何保护。

读过PGP源代码而且能够访问公钥环的任何人都可以使用一个二进制文件编辑器修改任何一位,而密钥环的所有者却无法注意到这个修改。幸运的是,PGP提供了一种方法重新检查密钥环中的密钥。通过联合 -kc和 -km选项,用户可告诉PGP执行对整个密钥环的密钥维护。

前一个选项告诉PGP检查密钥和签名。PGP会查看整个密钥环,重新检查每一个签名。当检查了所有签名之后,PGP将执行一个维护性检查(-km),重新计算所有密钥的有效性。

不幸的是,没有一种办法能够完全重新检查密钥中的所有信任字节,这是一个漏洞。应当有一个命令告诉PGP忽略所有信任字节,从终极密钥,即私钥环中的密钥,向用户询问信任性。

或许PGP将来的版本会改正这个问题。如果一个密钥被改成是可信任的介绍人,你没有办法找到修改之处并改正它。运行密钥和维护检查只能恢复密钥的有效性,但不是信任值。只有对一个密钥运行PGP -ke才能编辑信任参数,而这不能自动完成。

4.程序的安全性

如果有人能够访问PGP程序的二进制文件,他就可以改变它,让它做他想做的任何事。

如果这个介入者能够从你的鼻子底下替换你的PGP二进制文件,你对PGP的信任就建立在你对这个人的信任和你实际验证这个程序的能力上。例如,一个能够进行这种访问的攻击者可能会改变PGP,使得它总是验证签名,甚至签名是无效的。PGP可能被修改,总是向NSA发送所有消息的纯文本复制。这些攻击很难检测,而且难于对付。PGP需要成为受托代码基础的一部分;如果你不信任你的PGP二进制文件,那就不要信任它的输出。

相信PGP二进制文件最好的办法就是自己从源代码建立它。然而,这并不总是可能的。

其他办法包括在它建立时监视它或者从一个受托的来源得到它。查看二进制文件的大小和日期很有帮助。使用其他受托的程序,像md5sum能有所帮助。但这只是把问题压到了另一层。如果你不信任PGP程序,就没有太多做的了。

5.对PGP的其他攻击

对PGP可能还有其他攻击,但是这里不作讨论。从来没有证明过PGP使用的加密算法是安全的。PGP所使用的数学虽然被认为是安全的,但是有可能很容易攻破。对RSA的分解攻击可能得到改进,或者有人可能在IDEA中找到一个漏洞。

6.MD5的安全性问题

MD5算法在PGP中被用来单向变换用户口令和对信息签名的单向散列算法。一种单向散列的强度,主要体现在它能把任意的输入数随机化到什么程度,并且能产生唯一的输出。对单向散列的直接攻击可以分为普通直接攻击和生日攻击。

(1)对MD5的普通直接攻击

普通直接攻击又常常称为野蛮攻击。攻击者为了找到一份和原始明文m散列结果相同的明文m,就是H(m)=H(m)。普通直接攻击就是穷举可能的明文去产生一个和H(m)相同的散列结果。对MD5而言,如果散列结果为128bits,则表明攻击者使用一台每秒尝试1000 000000条明文的机器,理论上也要计算大约1022年,才可能会同时发现m本身。

(2)对MD5的生日攻击

这里要提到的就是有名的概率生日问题。在N个人中至少有两个人生日相同的概率是多少?MD5生日攻击实际上只是用概率来指导散列冲突的发现,对于MD5而言,如果尝试264条明文,则在它们中间至少有一对发生冲突的概率就是50%。

生日攻击只是为了找到两条能产生同样散列结果的明文。对当今的科技能力而言,它也是不可能的。有研究表明,一台计算机平均需要运行585年,才有可能找到一对同样散列结果的明文,而且还不能马上变成实际的攻击成果。

(3)其他对MD5的攻击

微分攻击被证明是对MD5的一次循环是有效的,但对全部4次循环却毫无效果。

还有一种成功的MD5攻击,不过它是对MD5代码本身做了变化,准确点说是一种破解而不是攻击。如果做了PGP发行包的签名校验,则很容易就发现代码已经被替换掉了。

(4)口令长度和信息论

根据传统信息论,英语中每个8bits字母的信息熵(信息熵是信息论中用于度量信息量的一个概念。一个系统越是有序,信息熵就越低;反之,一个系统越是混乱,信息熵就越高。一般用符号H表示,单位是比特)为1.3bits。如果口令足够长,MD5的结果就会更加随机。

对128bits的MD5输出而言,一个长达98个字符的口令将给出一个随机如下密钥。

(8/1.3)*(128/8)= 98.46 chars

但没有人会使用一个像下面这样长的口令:

12345678901234567890123456789012345678901235678901234567890
      1234567890123456789012345678

1.3 bits的信息熵来自于英语语法的规律性这个事实,字母出现概率的不等造成了熵的减小。如果26个拉丁字母出现的概率均等,信息熵将会增加到:Log(26)/Log(2) = 4.7 bits。

这样,一个随机密钥所需口令长度就减为27.23 chars了,如果再加上大小写和几个符号,还会更少。

7.随机数的安全性问题

PGP有两个伪随机数发生器,分别是ANSI X9.17发生器和从用户击键的时间与序列中计算熵值从而引入随机性。ANSI X9.17 PRNG使用IDEA加密算法来产生随机数种子。利用用户击键信息产生的Randseed.bin文件,在每次加密前后都会使用新的、本身加密保存的随机数。

(1)ANSI X9.17 PRNG

官方发布的ANSI X9.17标准使用了Triple DES作为内核,这样,还可以改用IDEA实现。ANSI X9.17标准需要Randseed.bin中的24 bytes的随机数,PGP把其他384 bytes用来存放其他信息。

ANSI X9.17标准工作过程大致如下。

E()= IDEA加密函数,使用一个可复用的密钥(使用明文产生)。

T = 从Randseed.bin文件中来的时间

V = 初始化向量

R = 生成的随机密钥(用来加密一次PGP明文)

R = E[E(T)XOR V]

下一次的初始化向量计算如下。

V = E[E(T)XOR R]

(2)用户击键引入随机性

这产生的是真正的随机数,只是在敲击键盘保持无规则可循就可以了。输入的熵越大,输出的随机数的熵就越大。

(3)X9.17用MD5进行预洗

“洗”类似于平时生活中说的洗牌一样,把数据打乱,加密前叫预洗,加密后为下一次加密的准备叫后洗。PGP的日常随机数产生器X19.7是用明文的MD5值来预洗的,它基于攻击者不知道明文这样一个假设。

如果攻击者知道明文,就没有必要去攻击了,当然也有这种可能,只是会削弱一点PRNG的随机性罢了。

(4)Randseed.bin的后洗操作

后洗操作是更安全的操作。更多的随机字节被用来重新初始化Randseed.bin文件,它们被用当前的随机临时PGP密钥来加密。同样,如果攻击者知道了这个密钥,就不用攻击Randseed.bin文件了,而只需关注Randseed.bin文件当前的状态即可,因为里面可能存放着下次加密的部分信息。因此,对Randseed.bin文件的保护和公钥环及私钥环文件同样重要。当然,如果遇到的不是专门研究密码的专家,这些文件即使全部泄露,也是无关紧要的。

8.PGP的密钥和口令的安全性问题

最简单的泄密方式就是把口令写在某地方,又不能保证除自己之外没有其他人能看到。如果让别人得到口令和私钥文件,整个加密体系就无密可言了。

还有就是口令不要太简单,注意PGP用的是“口令”passphase,而不是“密码”password(即口令中可以包含多个词和空格)。一个经验老练的攻击者可能会用一本名言录来破解口令,因此,为了得到好记又难猜的口令,可以生造一些句子或者找些非常生僻的句子。推荐采用一句话中首字母的序列组合,然后在其中加入几个符号,如“.”“-”“;”等,长度最好大于等于8个字符,同时也可夹杂大小写。

例如,从 “We can get it without your passphase”一句话中可以得到“wCgi.wyp”这样一个口令,就是用穷举法试探出这个口令也有一定难度,因为它用到了大小写字母和符号,平均要试探约508次才有可能成功,以IDEA的速度,这在一般大型计算机上也不是轻而易举的事。因此,短的口令只要随机性够大,一样可以做到很安全,而且输入口令使用时间越短,被窥探的可能也越小。

因此,PGP的最大威胁可以认为就是公钥的篡改和冒充,要点就是:当用别人的公钥时,确信它是直接从对方处得来或由另一个可信的人签名认证过的;确信没有人可以篡改自己的公钥环文件;保持对自己密钥环文件的物理控制权,尽量存放在自己的个人电脑里而不是一个远程的分时系统里;备份自己的密钥环文件。

9.没有完全删除的文件

一般的操作系统在删除文件时,都并没有彻底删除文件的数据,当加密明文后虽然将明文删除了,但并没有从物理上把明文的数据清除。

一些有经验的攻击者仍然可能从磁盘数据块中恢复明文。当然,像碎纸机一样,也可以使用一些工具软件从物理上销毁文件的办法。不过,最简单的办法还是通过添加一些无用的信息将明文文件覆盖。值得注意的是,即使覆盖了所有明文曾占用的磁盘空间,仍然会有微小的剩余空间留在磁盘上,专用的设备可以恢复这些数据,只是一般人达不到这个条件。

对于使用的密钥环文件同样存在这个问题,特别是私钥环文件,直接关系到私钥的安全。因此,除了专用的个人计算机,最好不要将密钥环放到其他机器上,让它们留在自己的软盘上是个安全的办法。

10.物理安全性

物理安全性是PGP不能赋予的,这种攻击比密码学分析要直接得多。PGP无法在一个不保密的环境中保护未加密的明文。

当然,物理安全性也包括对PGP数据的物理安全保护,像防火、防水、防雷等。

11.多用户系统下的泄密

PGP最初是为MS-DOS系统设计的,它认为系统在用户的直接物理控制下。但随着PGP的普及,多用户系统上也出现了PGP,这就在很大程度上提高了暴露明文、密钥或口令的可能性。但也有安全的多用户系统,禁得起所有入侵者所能获得的手段攻击,或其用户都是可以信赖的,要不就是根本没有人对这一系统进行攻击。

正如现实的PGP攻击中,在多用户系统中泄密的风险要大得多。所以尽量在单用户系统中使用PGP,而且保证系统处于自己的直接物理控制之下。

12.PGP的时间标戳可靠性

PGP签名上的时间标戳也可能是错误的,因为任何想伪造一个“错误”时间标戳的人,都可以通过修改系统时间达到目的。

而在商业上,又有这种利用PGP签名时间来确认责任的需要,这样,第三方的时间公证体系就被建立了。很明显,只要公证方在邮件上签上标准的时间,就解决了这个问题。实际上,这个问题对于手写的签名也存在,签字时需要一个公证人,来证明签名的时间(数字签名也一样)。

PGP设计模式是让第三方提供公证服务,服务器对每个送来的签名,自动加上自己的签名后返回,并同时留下一份记录,这份记录是公开的,需要进行时间验证的人可以去查看这个记录。

13.流量攻击

流量分析是指攻击者阅读不到密文的真实内容,但却可以通过观察邮件从哪儿来、到哪儿去、邮件大小以及邮件发送的时间等,从而获得一些有用的信息,就像可以查阅长途电话费单,但却不可能知道谈话的内容。

单独靠PGP是阻止不了攻击者进行流量分析的,借助一些网络通信协议可以防止这些信息的暴露,最好可以采用另一些加密通信体系的协助。

14.现实的PGP攻击揭秘

上面所说的攻击都是一些一般攻击者可能做不到或太费事的攻击方法,实际上,还有一些“可行的”PGP攻击,它们不是攻击PGP密码体系本身,而是攻击PGP的实现系统。

(1)击键窥探

这是一种非常有效的攻击方法,简单地说就是记录用户的击键信息,从中获得口令。攻击者通过键盘记录器窥探用户的击键序列,具体方法会由于系统不同而不同。

目前已经出现了至少一种Windows下的记录器,这就对基于Windows系统的PGP外壳产生了威胁。如果被攻击者是在X-Windows系统环境下输入了口令,则X-Windows系统环境下的记录器将不用root权限。要防止这种攻击,最好还是对工作环境进行仔细检查,同时做好私钥环文件的保存。

(2)电磁泄露窥探

任何计算机设备(尤其是显示器)都存在电磁泄露的问题,通过合适的设备可以收到目标显示器上的信息,那么明文显示时就无密可言了。

这里就是通过类似装置监听到一个间谍的显示器和键盘信号的案例。

在要窥探的计算机里偷偷设置发射器,远程接收信号,然后通过专用的FFT芯片去除噪音,完成了取证工作。射频信号大约22MHz,在接收端加上27KHz的水平同步信号和59.94Hz的垂直同步信号,就可以得到清晰的图像。由于键盘用的是串行单片机通信接口,则信号将更容易稳定。加装一个射频信号干扰器可以有效防止显示器信号泄露。键盘信号传不远,只要没人在计算机里安“耳朵”,就不怕泄露。

(3)磁盘缓存窥探

在Windows这样的多任务操作系统中,系统会把内存中的内容交换到磁盘上,而且这些交换文件对用户是透明的。令人担忧的是,这些内容并不会很快被清除,有可能一直在磁盘上保留。如果在网络环境中,可能会在连用户自己都感觉不到的情况下,信息就被人窃取了。

(4)报文嗅探

在网络环境下,信息是以报文的形式在线路中传输的。如果是通过网络远程使用PGP,就有可能被人从报文传输途中监听到。

要想知道什么安全、什么不安全,对密码技术所运用的数学知识了解得还不够。实际上,据知任何事都不是完全安全的,如果有足够的计算能力,任何形式的密码技术都可以攻破。

问题是破译代码所花费的时间和精力与被保护的数据价值相比是否值得。注意破译代码所花费的力量将随着时间不断地减少,因为计算机的能力不断增强,而价格不断地下降。到现在为止,密码专家仍然超前于破译者。