第12章电子邮件的安全性1.PGP(PrettyGoodPrivacs)2.S/MIME1.PGP•PGP的来源PGP主要由于PhilZimmermann一个人的贡献,PGP提供了一种机密性和鉴别的服务,可以用于电子邮件和文件存储的应用。Zimmermann主要做了下面一些工作:1.选择最好的、可用的加密算法作为基础构件。2.将这些算法集成起来,形成一个通用的独立于操作系统和处理器的应用程序,该应用程序基于易于使用的命令构成的小集合。3.制作了软件包和相应的文档,包括源代码,通过Internet、电子公告牌和如Compuserve的商业网,免费提供给用户。4.和一个公司(Viacrypt,现在是NetworkAssociates)签订了合同,提供PGP的完全兼容的、低价格的商用版本。1.PGP•PGP的发展特点PGP发展非常迅速,现在已经被广泛应用。PGP得到快速发展的原因包括以下一些:1.它是全世界免费可得到的,包括了运行在不同平台的多个版本,诸如:DOS/Wndow,Unix,Macintosh等。另外,商用版本满足了那些想要获得厂家技术支持的用户的需要。2.它建立在一些经过公开评议,被认为是非常安全的算法的基础上。具体来说,PGP软件包包括了公开密钥的RSA,DSS和Diffie-Hellman加密算法;常规的CAST-128,IDEA和3DES加密算法;以及散列编码的SHA-1算法。3.它的应用范围非常广,从想要选择和实施一个标准模式来加密文件和消息的公司到想要通过Internet或其他网络和他人进行安全通信的个人都可以使用。4.它不是任何政府或标准化组织开发的,因而也不会被它们控制。对于那些本质上不信任任何“组织机构”的人来说,PGP具有吸引力。1.PGP•PGP的操作功能使用的算法描述鉴别(数字签名)DSS/SHA或RSA/SHA使用SHA-1创建的报文的散列编码。采用DSS或RSA算法使用发送者的私有密钥对这个报文摘要进行加密,并且包含在报文中机密性(报文加密)CAST或IDEA或三密钥三DES,带有Diffie-Hellman算法或RSA采用CAST-128或IDEA或3DES,使用发送者生成的一次性会话密钥对报文进行加密,采用Diffie-Hellman或RSA,使用接收方的公开密钥对会话密钥进行加密并包含在报文中压缩ZIP报文可以使用ZIP进行压缩,用于存储或传输电子邮件兼容性64基转换为了提供电子邮件应用的透明性,加密的报文可以使用64基转换算法转换成ASCII字符串分段--为了满足最大报文长度的限制,PGP完成报文的分段和重新装配1.PGP•PGP加密功能EKUb[Ks]MZKsEPECMKRaM比较HZ-1(a)只进行鉴别源点终点||HM比较DP(b)只保证机密性KRbEKRa[H(M)]HDC||EPDPKUbZ-1ECZ-1Ks||EKUb[Ks]EPHKUaDPDCMKUaZEPKRa(c)鉴别与机密性||HMKUbKRbDPEKRa[H(M)]1.PGP•PGP的操作——鉴别1.发送者创建报文。2.使用SHA-l来生成报文的160bit散列代码。3.使用发送者的私有密钥,采用RSA算法对散列代码进行加密,结果串接在报文的前面。4.接收者使用发送者的公开密钥,采用RSA解密和恢复散列代码。5.接收者为报文生成新的散列代码,并与被解密的散列代码相比较。如果两者匹配,则报文作为已鉴别的报文而接受。尽管签名一般和所签的报文或文件附加在一起,但这并不是必需的:分离的签名也是支持的。分离的签名可以和所签的报文分开存储和传输,这种方法在好几种场合中都是有用的。用户可能想要保持单独的所发送或接收的所有报文的签名日志。可执行程序的分离签名可以检测出接下来的病毒侵入。最后,分离签名可以用在需要多方签名的文档上,如法律合同。每个人的签名是独立的,因而可以只是应用到文档上。否则,签名将只能递归使用,第二个签名对文档和第一个签名进行签名,依此类推。1.PGP•PGP的操作——机密性1.发送者生成报文和128bit的用作该报文会话密钥的随机数。2.采用CAST-128(或IDEA或3DES)算法,使用会话密钥对报文进行加密。使用64bit来加密反馈(CFB)模式。3.采用RSA算法,使用接收者的公开密钥对会话密钥进行加密,并附加到报文前面。4.接收者采用RSA算法,使用自己的私有密钥解密和恢复会话密钥。5.使用会话密钥来解密报文。除了使用RSA对密钥加密之外,PGP提供了另一种称为Diffie-Hellman的选择。实际上,PGP使用的是Diffie-Hellman的提供加密/解密的变体一一ElGamal。PGP提供给用户的密钥长度的范围达到768到3072比特。1.PGP•PGP的操作——机密性与鉴别PGP可以对报文可以同时使用两个服务。首先,为明文报文生成签名并附加到报文首部。然后使用CAST-128(或IDEA或3DES)对明文报文和签名进行加密,再使用RSA(或ElGamal)对会话密码进行加密。这个步骤比相反的步骤要好:加密报文然后再生成加密后的报文的签名。将签名与明文报文存储在一起更加方便。另外,为了方便第三方验证,如果首先产生签名,第三方在验证签名时就不需要与常规密钥打交道。总之,当同时使用两个服务时,发送者首先用自己的私有密钥为报文签名,然后使用会话密钥对报文加密,接着再用接收者的公开密钥对会话密钥进行加密。1.PGP•PGP的操作——压缩在默认情况下,在签名之后加密之前,PGP可以对报文进行压缩。这有利于在电子邮件传输和文件存储时节省空间。压缩算法使用的是ZIP。1.在压缩之前生成签名有两个理由:a.对没有经过压缩的报文进行签名更好,这样为了将来的验证只需要存储没压缩的报文和签名。如果对压缩文档签名,那么为了将来的验证就必须或者存储压缩过的报文,或者在需要验证时重新压缩报文。b.即使一个人愿意在验证时动态生成重新压缩的报文,PGP的压缩算法也存在问题。算法不是固定的,算法的不同实现在运行速度和压缩比上进行不同的折衷,因此产生了不同的压缩形式。但是,这些不同的压缩算法是可以互操作的,因为任何版本的算法都可以正确地解压其他版本的输出。在压缩之后应用散列函数和签名,将约束所有的PGP实现都使用同样的压缩算法。2.在压缩之后对报文加密可以加强加密的强度。因为压缩过的报文比原始明文冗余更少,密码分析更加困难。1.PGP•PGP的操作——电子邮件的兼容性很多电子邮件系统只允许使用由ASCII正文组成的块。为了满足这一约束,PGP提供了将原始8bit二进制流转换成可打印ASCII字符的服务。为这一目的采用的方案是radix-64转换。X←文件需要签名?生成签名X←签名||X压缩X←Z(X)需要机密性?转换成radix64X←R64[X]是否加秘密钥XX←EKUb[Ks]||EKs[X]是否从radix64转换X←R64-1[X]需要机密性?解秘密钥XX←DKRb[Ks];DKs[X]是否解缩X←Z-1(X)需要签名?从X中提取签名验证签名是否1.PGP•PGP的操作——分段和重装电子邮件设施经常受限于最大的报文长度。例如,很多Internet可以访问的设施都有最大50000个八位组的限制。任何长度超过这个数值的报文都必须划分成更小的报文段,每个段单独发送。为了满足这个约束,PGP自动将太长的报文划分成可以使用电子邮件发送的足够小的报文段。分段是在所有其他的处理(包括radix-64转换)完成之后才进行的,因此会话密钥部分和签名部分只在第一个报文段的开始位置出现一次。1.PGP•PGP报文格式内容操作会话密钥部分签名报文接收者公开密钥(KUb)的密钥ID会话密钥(Ks)时间戳报文摘要的前两个八位组发送者公开密钥(KUa)的密钥ID报文摘要文件名时间戳数据KUbKRaZIPR64EKs记号:EKUbEKRaEKsZIPR64=使用用户b的私有密钥进行加密=使用用户a的私有密钥进行加密=使用会话密钥加密=Zip压缩功能=Radix-64转换1.PGP•PGP加密密钥和密钥环PGP利用了四种类型的密钥:一次性会话的常规密钥、公开密钥。私有密钥和基于口令短语(passphrase)的常规密钥(在下面解释)。对于这些密钥存在三种独立的需求:1.需要生成一种不可预测的会话密钥的方法。2.允许用户拥有多个公开/私有密钥对。一个理由是用户可能想要不时地改变他或她的密钥对。当发生了这种情况时,管道中所有报文都将是用过时的密钥构造的。此外,接收者在接到改变的通知之前只知道旧的公开密钥。除了不时地改变密钥的需要之外,在给定的时刻,用户可能想要拥有多个密钥对来和不同的通信组交互,或者只是为了增强安全性而限制密钥能够加密的报文的数量。这些原因的结果就是在用户和他们的公开密钥之间不存在一一对应的关系。因此,需要某种方法来标识特定的密钥。3.每个PGP实体必须维护它自己的公开/私有密钥对的文件,以及与它通信的人的公开密钥文件。1.PGP•PGP会话密钥和IV的生成参见《密码编码学与网络安全:原理与实践(第二版)》附录12C。rseedrbufrbufrbufrseedrseedrseeddbufEEEEEEEK[16…32]K[8…15]K[0…7]1.PGP•PGP的密钥标识符PGP采用的解决方法是给每个公开密钥指派一个密钥ID,这在用户ID中很可能是惟一的。密钥ID与每个公开密钥相关联,并由公开密钥的最低64比特组成,即,公开密钥KUa的密钥ID是(KUamod264)。这个长度足以使密钥ID重复概率非常小。PCP的数字签名也需要密钥ID。因为发送者可能使用一组私有密钥中的一个来加密报文摘要,接收者必须知道应该使用哪个公开密钥来解密。相应地,报文的数字签名部分包括了需要的公开密钥的64bit密钥ID。当报文被收到时,接收者验证该密钥ID是它所知道的发送者的公开密钥,然后接着来验证签名。1.PGP•PGP的密钥环任何一个PGP报文中包括的两个密钥ID提供了机密性和鉴别。这些密钥需要以一种系统化的方法来存储和组织,使得各方能够有效和高效地使用它们。PGP使用的方法是在每个结点提供一对数据结构,一个用来存储该结点拥有的公开/私有密钥对,另一个用来存储该结点所知道的其他用户的公开密钥。相应地,这些数据结构被称为私有密钥环和公开密钥环。1.PGP•PGP私有密钥环的一般结构–时间戳:该密钥对生成的日期/时间。–密钥ID:这个实体的公开密钥的低位64比特。–公开密钥:密钥对的公开密钥部分。–私有密钥:密钥对的私有密钥部分;这个字段是加密的。–用户ID:这个字段的典型值是用户的电子邮件地址(例如,stallings@acm.org)。然而,用户可以为每个密钥对选择不同的名字(例如,Stallings,Wstallings,Williamstallings等等),或者多次重用相同的用户ID。时间戳密钥ID公开密钥加密的私有密钥用户ID···············TiKUimod264KUiEH(Pi)[KRi]用户i···············1.PGP•PGP对私有密钥的保护尽管想要私有密钥环只存储在创建和拥有密钥对的用户的机器上,并且只有该用户可以访问私有密钥环,但确保私有密钥的值尽可能地安全仍然很有意义。相应地,私有密钥本身并不存储在密钥环中,相反,要使用CAST-128(或IDEA或3DES)来对这个密钥加密。其步骤如下:1.用户选择口令短语用来对私有密钥进行加密。2.当系统使用RSA生成新的公开/私有密钥对时,它向用户要求那个口令短语。使用SHA-1生成该口令短语的160bit的散列编码,然后该口令短语被丢弃。3.系统使用CAST-128,将128bit的散列编码作为密钥来加密私有密钥。然后,散列编码被丢弃,加密过的私有密钥被存储在私有密钥环中。当用户访问私有密钥环来查询私有密钥时,他或她必须提供相应的口令短语。PGP将查询加密的私有密钥,生成口令短语的散列编码,然后使用该散列编码来应用CAST-128对加密的私有密钥进行解密。