他计算:
x=r^e%n(用T的公匙加密r)
y=x*c%n(将临时密文x与c相乘)
t=r^-1%n
A知道RSA具有下面的一个特性:
如果x=r^e%n,那么r=x^d%n
因此他想办法让T对y用T自己的私匙签名(实际上就是把y解密了),然后将结果u=y^d%n寄回给A。
A只要简单地计算:
m=t*u%n
上面结论的推导是这样的:
t*u%n=(r^-1)*(y^d)&n
=(r^-1)*(x^d)(c^d)%n
=(c^d)%n
=m
要防止这种攻击的办法就是不要对外来的随机信息签名,或者只对信息的MD5特征值签名。
在这里就很容易明白为什么要强调MD5的单向性了,因为MD5的结果是不能预定的,就是说A难以凑出一份刚好能产生y这样的MD5特征值的明文来让T签名。
●过小的加密指数e
看起来,e是一个小数并不降低RSA的安全性。
从计算速度考虑,e越小越好。
可是,当明文也是一个很小的数时就会出现问题。
例如我们取e=3,而且我们的明文m比n的三次方根要小,那么密文c=m^e%n就会等于m^3。
这样只要对密文开三次方就可以得到明文。
PGP对这个漏洞的处理是在明文上加上一个随机数,这样保证m>n,而且缺省的e值为17,如果不行再用19,23等等。
●RSA的计时攻击法
这是一种另辟蹊径的方法。
是由PaulKocher发表的。
大家可以发现,RSA的基本运算是乘方取模,这种运算的特点是耗费时间精确取决于乘方次数。
这样如果A能够监视到RSA解密的过程,并对它计时,他就能算出d来。
细节我就不复述了。
我想说的是如何抵御它。
Rivest说,最简单的方法就是使RSA在基本运算上花费均等的时间,而与操作数无关。
其次在加密前对数据做一个变换(花费恒定时间),在解密端做逆变换,这样总时间就不再依赖于操作数了。
至于PGP根本不用担心计时攻击,因为PGP采用了中国余数理论的方法加速了运算,同时也使耗时与操作数无关。
同时计时攻击对攻击者资源的要求太高,实时监视加密过程不是任何人都可能做到的。
在这里提出这种攻击是因为:
虽然它目前还不实用,但从理论上是一个崭新的思路,值得注意。
●其他对RSA的攻击法
还有一些对RSA的攻击,象公共模数攻击。
它是指几个用户公用一个模数n,各自有自己的e和d,在几个用户之间公用n会使攻击者能够不用分解n而恢复明文。
但是PGP是不会在用户之间公用模数的。
最后谈谈RSA密匙长度的问题,多长的密匙是安全的。
专家指出,任何预言都是不理智的,就目前的计算机水平用1024-bits的密匙是安全的,2048-bits是绝对安全的。
但是他们并不指望这个局面延续到下世纪,他们只是指出:
如果RSA象有些人说的那样脆弱,就不可能从1977年一直保持到现在还没有被攻破。
◎MD5的安全性问题
MD5是一种在PGP中被用来单向变换用户口令和对信息签名的单向散列算法。
一种单向散列的强度体现在它能把任意的输入随机化到什么程度并且能产生唯一的输出。
对单向散列的直接攻击可以分为普通直接攻击和“生日”攻击。
●对MD5的普通直接攻击
所谓直接攻击又叫野蛮攻击。
攻击者为了找到一份和原始明文m散列结果相同的明文m',就是H(m)=H(m')。
普通直接攻击,顾名思义就是穷举可能的明文去产生一个和H(m)相同的散列结果。
对MD5来说散列结果为128-bits,就是说如果攻击者有一台每秒尝试1,000,000,000条明文的机器需要算约10^22年,同时兴许会同时发现m本身:
))。
●对MD5的生日攻击
生日攻击实际上只是为了找到两条能产生同样散列结果的明文。
记得那个有名的概率生日问题吗?
在N个人中至少有两个人生日相同的概率是多少?
所谓生日攻击实际上只是用概率来指导散列冲突的发现,对于MD5来说如果尝试2^64条明文,那么它们之间至少有一对发生冲突的概率就是50%。
仅此而已,对当今的科技能力来说,它也是不可能的。
一台上面谈到的机器平均需要运行585年才能找到一对,而且并不能马上变成实际的攻击成果。
因为码长和速度的关系,对crypt(3)的生日攻击就成功得多。
●其他对MD5的攻击
微分攻击被证明对MD5的一次循环是有效的,但对全部4次循环无效。
(微分攻击是通过比较分析有特定区别的明文在通过加密后的变化传播情况来攻击加密体系的。
)
有一种成功的MD5攻击,不过它是对MD5代码本身做了手脚,是一种crack而不是hack更算不上cryptanalysis了。
而且如果你做了PGP发行包的签名校验,是容易发现代码被替换过了的。
●口令长度和信息论
根据传统信息论,英语的每个8-bits字母的信息熵为1.3bits。
如果口令足够长,MD5的结果就会足够随机。
对128-bits的MD5输出来说,一个长达98个字符的口令将给出一个随机的密匙。
(8/1.3)*(128/8)=98.46chars
可是谁会用一个象下面这样长的口令呢?
12345678901234567890123456789012345678901235678901234567890
1234567890123456789012345678
1.3bits的信息熵来自于英语语法的规律性这个事实,字母出现概率的不等造成了熵的减小。
如果26个拉丁字母出现的概率均等,信息熵将会增至
log(26)/log
(2)=4.7bits
这样一个随机密匙所需口令长度就减为27.23chars了,如果再加上大小写和几个符号还可以减少。
关于选择口令的问题可以参考任何关于安全性的书籍,它们都适用,上面是关于PGP本身特色的部分。
◎随机数的安全性问题
PGP使用两个伪随机数发生器(PRNG),一个是ANSIX9.17发生器,另一个是从用户击键的时间和序列中计算熵值从而引入随机性。
ANSIX9.17PRNG使用IDEA而不是3DES来产生随机数种子。
Randseed.bin文件最初是利用用户击键信息产生的,每次加密前后都会引入新的随机数,而且随机数种子本身也是加密存放的。
●ANSIX9.17PRNG
官方发布的ANSIX9.17标准使用的是TripleDES作为内核,这个很容易改用IDEA实现。
X9.17需要randseed.bin中的24bytes的随机数,PGP把其他384bytes用来存放其他信息。
X19.7工作过程大致如下:
E()=IDEA加密函数,使用一个可复用的密匙(使用明文产生)。
T=从randseed.bin文件中来的时间
V=初始化向量
R=生成的随机密匙(用来加密一次PGP明文)
R=E[E(T)XORV]
下一次的初始化向量计算如下:
V=E[E(T)XORR]
●用户击键引入随机性
这是真正的随机数,没有什么好说的,只是尽量使击键无规则就行。
输入的熵越大输出的随机数的熵就越大。
●X9.17用MD5进行预洗
所谓“洗”就是指象洗牌一样把数据打乱,加密前叫预洗,加密后为下一次加密的准备叫后洗。
PGP的日常随机数产生器X19.7是用明文的MD5值来预洗的,它基于攻击者不知道明文这样一个假设。
如果攻击者知道明文他就没有太大必要去攻击了,当然也有这种可能,不过这只是会削弱一点PRNG的随机性罢了。
下面我们将看到还有后洗操作。
●randseed.bin的后洗操作
后洗操作被认为是更安全的。
更多的随机字节被用来重新初始化randseed.bin文件,它们被用当前的随机临时PGP密匙来加密。
同样如果攻击者知道这个密匙,他就不用攻击randseed.bin文件,相反他更关心randseed.bin文件当前的状态,因为可能从中获得下次加密的部分信息。
因此对randseed.bin文件的保护和公匙环及私匙环文件同样重要。
当然,如果不是密码专家这些文件都给他也没事。
◎PGP的密匙和口令的安全性问题
最简单的失密方式就是你让你的口令写在某处,又无法保证除你之外没有其他人能看到。
如果别人得到你的口令和你的私匙文件,整个加密体系就无密可言了。
另一个古老的话题就是口令不要太简单,注意PGP用的是“口令”passphase,而不是“密码”password,就是说可以在口令中包含多个词和空格。
一个老谋深算的攻击者可能会用一本名言录来寻找你的口令。
因此为了得到好记又难猜的口令,你可以生造一些句子或者找些非常生僻的文学篇章中的句子。
我个人推荐的办法是采用一句话中的首字母的序列,然后在其中加入几个符号,如“.”,“-”,“;”等,长度最好大于等于8个字符,同时也可夹杂大小写。
由于有被人在旁边窥探你的击键动作的可能,最好不用空格键,因为敲它的声音很特殊。
同样,需要手指伸得很远的数字键也可不用。
例如:
从“Youcan'tgetitwithoutmypassphase”可以得到“yCgi.wyp”这个口令,用穷举法试探出这个口令的可能性微乎其微,因为它用到了大小写字母和符号。
平均要试探约50^8次才可能成功,以IDEA的速度,这在一般大型计算机上也不是轻而易举的事。
因此短的口令只要足够随机,一样很安全,而且输入口令时间越短,被窥探的可能也越小。
公匙的篡改和冒充可说是PGP的最大威胁,在《PGP简介中》我已经讲得比较详细了,要点就是:
当你用别人的公匙时,确信它是直接从对方处得来或是由另一个可信的人签名认证过的。
确信没有人可以篡改你自己的公匙环文件。
保持你对自己密匙环文件的物理控制权,尽量存放在自己的个人电脑里而不是一个远程的分时系统里。
备份自己的密匙环文件。
◎没有完全删除的文件
一般的操作系统在删除文件时都并没有彻底删除文件的数据,当你加密明文后将明文删除,可是没有从物理上把明文的数据清除。
一些有经验的攻击者可能从你的磁盘数据块中恢复明文。
当然象碎纸机一样,也有从物理上销毁文件的办法,它们是一些工具软件,如果没有,最简单的办法是用无用的信息将明文文件覆盖。
在PGP后加上-w参数也可以达到这一目的。
不过即使你覆盖了所有明文曾占用的磁盘空间,仍然会有微小的剩磁留在磁盘上,专用的设备可以恢复这些数据,只是一般人没有这个条件。
对于你使用的密匙环文件同样存在这个问题,特别是私匙环文件,直接关系到你的私匙的安全。
因此除了你专用的个人电脑,最好不要将密匙环拷入其他机器,让它们留在软盘上或许是个安全的办法。
◎物理安全性
这是PGP所不能赋予你的。
如果政府要调查你的话,它蛮可以直接去物理侵犯你的隐私,就象在水门事件中一样。
而且这种攻击比密码学分析要便宜得多。
PGP无法在一个不保密的环境中保护你的未加密的明文。
当然物理安全性也包括对PGP数据的物理安全保护象防火、防水、防雷等等,可是这都不如防人来得难办。
◎多用户系统下的泄密
PGP最初是为MS-DOS设计的,它假设本身在用户的直接物理控制下。
可是随着PGP的普及