1.3.1 密码学的目标
虽然密码学是为了确保安全性的,但是它自身也存在着一些根本问题需要解决,当然它的重要性取决于谁来攻击你以及你为了对抗攻击者采用了什么样的安全措施。本小节中提到的密码学的目标包括:保密性、完整性、认证和不可否认(以讲述的先后顺序)。
1. 保密性保密性是具有隐藏消息的真实含义和目的的属性。特别地,当消息在信息传输媒介中传输的时候,为了防止消息被那些不希望其了解消息真实内容的人所窃取,而把消息隐藏起来。这些传输媒介包括Internet、无线网络、蜂窝电话网络,等等。
典型的实现保密性的方法是使用对称加密算法。这些算法利用密钥对原始消息(即明文)进行加密产生几块信息(即密文)。从信息论的基本观点来看,密文和明文具有相同数量的信息熵。这也就是说密文的接收者只需要同样的密钥以及密文就可以重新还原出明文。
对称密码算法可以通过两种形式来举例说明,每一种都有自己要强调的地方,同时也都各有不足。本书只深入讨论分组密码,主要是美国国家标准与技术协会(NIST)的高级加密标准(AES)分组密码算法。AES分组密码非常流行,因为它无论是在大的还是小的处理器上都可以非常有效地运行并且在硬件实现上采用了低成本的设计技术。分组密码比它的“表兄”流密码要流行,因为它容易理解并且应用广泛。正如我们所见,AES可以用来创建各种保密算法(包括一种看起来像流密码的模式)以及完整性检验和安全认证算法。AES是免费的,并且从知识产权(IP)角度来看,它的说明文档很详细而且是基于可靠的密码学理论的(如图1-1所示)。

注意 网址: http://csrc.nist.gov/Crypto Toolkit/aes/rijndael/。高级加密标准(AES)是NIST官方推荐使用的分组加密算法。由于它的设计目的是用来替代使用已久并且速度很慢的DES加密算法,所以它目前在许多领域里有着非常广泛的应用。2. 完整性完整性是指在不存在一个活动的攻击者参与的情况下确保信息和数据的正确性。这听起来比其实际情况要复杂得多。简单地说,就是保证信息在从A传输到B的过程中,其含义(或内容)没有被修改。完整性仅限于攻击者并不打算篡改传输数据的正确性的情况下。
完整性检验通常是通过密码学中的单向散列函数来实现的。这些算法把输入看成可以是任意长度的消息并且产生一个固定大小的消息摘要。消息摘要(或者简称摘要)通常是在160到512位之间,它是消息的表示形式。也就是说,给定消息和与其相对应的摘要,可以判断消息在传输过程中有没有被修改过。散列函数的设计具有一些很有趣的特点,比如说要必须具备单向性并且能够避免冲突(如图1-2所示)。

散列算法设计成单向的主要是,它是一种用来实现基于密码的认证系统的方法。这也就意味着如果给定一个消息摘要,人们在可行的时间内(低于指级的)是不能计算出生成这个摘要的输入的。同样地,散列算法的单向性也是实现其他算法安全性的一个必要条件,例如第5章中的散列消息认证码(HMAC)。
散列算法也要求在两种情况下是可以避免碰撞的。一种情况是针对固定的消息要求避免产生预映射约束(pre-image resistant)(如图1-3所示)。也就是说,给定一个值y很难找到消息M使得hash(M)=y。第二种情况通常称为第二预映射约束(如图1-4所示),是指不能找到两个消息M1 (给定的)和M2(随机选取)使得hash(M1)= hash(M2)。只有这两个条件都满足才能叫做碰撞约束。

散列并不是基于密钥的算法,也就是说在算法的整个流程处理过程中,没有什么不能让攻击者知道的机密信息。加密者可以计算一个公开消息的消息摘要,攻击者也可以。由于这个原因,在攻击者实施攻击的情况下,我们无法确定消息是否完整。
即使考虑到具有这种潜在的危险,但是散列算法还是被广泛地应用于计算领域。例如,大多数在线发布的Linux和BSD程序都提供了如md5sum之类的计算文件消息摘要的程序。一般情况下,作为用户更新过程的一部分,用户既需要下载文件也需要更新文件的摘要。假如威胁模型只考虑到像文件的重复和覆盖等存储以及发布上的错误,而没有考虑到攻击者因素,这种做法就很有用。
本书讨论了流行的安全散列标准(SHS)SHA-1和SHA-2系列散列算法,同时这也是NIST所设计的密码学算法中的一种。特别是SHA-2系列相当地具有吸引力,因为它引入了可以产生224到512位消息摘要的散列函数。考虑到这些算法不需要存储表和复杂的指令,所以它们的效率很高,而且也可以根据指定的信息重新产生消息摘要。警告! MD5散列算法的安全性已经变得很弱。Dobbertin发现了该算法关键部分的缺陷,并且在2005年研究人员发现了该算法中函数的完全碰撞。2006年初发表的一些论文讨论了如何更快地寻找碰撞的方法。
这些研究人员大部分是研究第二预映射碰撞,但已经存在利用这种碰撞攻击IDS和分布式系统的方法。
强烈建议开发者避免使用MD5散列函数。在一定程度上,为了更好地使用新的SHA-2散列算法,甚至SHA-1散列算法也应该避免使用。对于下文中提到的欧洲标准,Whirlpool散列算法也可以作为一种选择。
3. 认证认证是指身份特征或者消息实体的代表的属性。一个经典的例子就是用于信件上的蜡封。这个标记在使用的时候很难被伪造,并且完好无损的标记意味着文档是经过认证的。
另外一种认证的常见形式是输入个人识别码(PIN)或者密码来认证一次交易。不要和不可否认性混淆,不可否认性是为了防止别人否认协议的;同样也不能和认证协议相关的密钥协商与建立协议相混淆。当我们说在认证一个消息时,意思是指:在敌人可能会对消息进行伪造的情况下,采取额外的步骤以便接收者能够对消息的完整性进行验证。
密钥协商的过程和可靠性的相关问题是公开密钥协议的一个研究方向。它们使用大致相同的基本操作,但却有着不同的约束和目标。一个认证算法通常意味着是对称算法,以便所有参与认证的成员都能生成可以验证的数据。具有不可否认这一性质的可靠性通常只有一个认证信息的生产者以及多个验证者。
在密码学世界中,这些认证算法通常叫做消息认证码(Message Authentication Code MAC),并且像散列函数一样产生一个固定大小的输出,称为消息标记。这个标记是验证者用于检验文档的信息。和散列函数不同的是,这一系列的MAC函数需要秘密密钥来阻止任何人对标记进行伪造(如图1-5所示)。

两种最常见的MAC算法形式是CBC-MAC(现在由OMAC1算法实现并且在NIST 圈内称为CMAC)和HMAC函数。CBC-MAC(或者叫CMAC)使用分组密码算法,而HMAC使用散列函数。本书包含了由NIST认可的CMAC以及HMAC消息认证码算法。
另外一种实现认证的方法是使用公钥算法,如使用PKCS#1标准的RSA或者椭圆曲线DSA(EC-DSA或者ASNI X9.62)标准。与CMAC或HAMC不同的是,基于公钥的认证算法不需要双方在通信之前共享私有信息。因此当处理随机的、未知的参与认证成员时,公钥算法并不局限于在线交易这一领域。也就是说,你可以对一个文档进行签名,那么任何一个拥有公钥的人都可以进行验证而事先并不需要和你联系。
公钥算法的使用方法不同于MAC算法,这些将以另外一个主题在后面的章节里讨论(如表1-1所示)。

使用什么样的方式认证取决于认证者是如何构造认证系统的。基于公钥的认证系统通常用于一个新建立的交流媒介的初始认证。例如,当你第一次连接到一个使用SSL的网站时,你需要验证这个网站的证书签名确实是由合法签名者所签的。相反,当传输信道已经安全的情况下,才会使用像CMAC和HMAC这样的算法。使用它们是为了保证数据流在传输过程中没有被篡改。由于CMAC和HMAC处理数据的速度极快,所以它们在流量大的传输媒介中能发挥更高的价值。
4. 不可否认不可否认具有同意负责任这一属性。更确切地说,是无法反驳应尽的责任。例如,你拿了一支笔在(具有法律效力的)合同上签了自己的名字,那么你的签名就是一种不可否认的“设备”。事后你不能不同意合同上的条款或者拒绝承认曾经同意了合同。
不可否认和认证的性质十分相似,因为从实现的角度上来讲,它们大都使用了相同的基本原理。例如,当且仅当一个特殊的成员具备签名能力的时候,他的公钥签名才能称为不可否认“设备”。因此,像CMAC和HACM这样的其他MAC算法都不能叫做不可否认设备。
不可否认在现金交易和审计工作中的作用非常重要,而这一点却常被忽视。例如,信用卡收据上面的钢笔签名很少有人去效验,即使职员看了一眼信用卡的背面,但由于他不是笔迹专家,所以也不能从实物中分辨出细微的伪造之处。手机也经常使用MAC算法作为资源使用认证者,因此它不具有不可否认性质。
5. 目标概括表1-2比较了4种主要的密码学目标。

【责任编辑:
杨硕 TEL:(010)68476636-8001】