我们一步一步地介绍基于密码学的安全概念。第一步是本节介绍的加密算法--密码器和加密散列--。它们本身并不是一个解决方案,而是可以用来构建解决方案的构件。加密算法的参数是由钥匙决定的,后面一节将讨论分配钥匙的问题。在下一步中,我们描述了如何将加密构件纳入协议,在拥有正确密钥的参与者之间提供安全通信。然后,最后一节研究了目前使用的几个完整的安全协议和系统。
密码器的原理
加密以这样一种方式对信息进行转换,使其对于没有掌握如何逆转转换秘密的任何一方来说都是不可理解的。如图195所示,发送方对原始明文信息应用一个加密函数,产生一个通过网络发送的密文信息。接收者应用一个秘密的解密函数--加密函数的反转,以恢复原始明文。假设窃听者不知道解密函数,那么在网络上传输的密码文本对任何窃听者来说都是不可理解的。由加密函数和其相应的解密函数所代表的转换被称为cipher。
加密学家们被引向一个原则,这个原则最早在1883年提出,即加密和解密函数应该由一个密钥来设定参数,此外,这些函数应该被视为公共知识,只有密钥需要保密。因此,对于一个给定的明文信息,产生的密码文本取决于加密函数和密钥。这一原则的一个原因是,如果你依赖于密码的保密性,那么当你认为它不再是秘密的时候,你就必须退出密码(不仅仅是密钥)。这意味着可能会频繁更换密码,这是有问题的,因为开发一个新的密码需要大量的工作。此外,知道一个密码是否安全的最好方法之一是长期使用它,如果没有人破解它,它可能是安全的。(幸运的是,有很多人都会尝试破解密码,而且当他们成功时,会让大家知道,所以没有消息通常是好消息)。因此,部署一个新的密码会有相当大的成本和风险。最后,用密钥对密码进行参数化,实际上为我们提供了一个非常大的密码家族;通过切换密钥,我们基本上可以切换密码,从而限制了密码分析员(破译者)可以用来尝试破解我们的密钥/密码的数据量,以及如果她成功了,她可以读取的数量。
加密算法的基本要求是,它将明文转化为密码文本的方式,只有预期的接收者--解密密钥的持有者--能够恢复明文。这意味着加密的信息不能被不持有密钥的人读取。
重要的是要认识到,当一个潜在的攻击者收到一段密码文本时,他所掌握的信息可能比密码文本本身更多。例如,他可能知道明文是用英语写的,这意味着字母e在明文中出现的频率比任何其他字母都高;许多其他字母和常见字母组合的频率也可以预测。这些信息可以大大简化寻找钥匙的任务。同样,他可能知道一些关于信息的可能内容;例如,"登录 "一词可能出现在远程登录会话的开始。这可能使已知的明文攻击成为可能,这比仅有密码文本的攻击有更大的成功机会。更好的是选择的明文攻击,这可以通过向发送者提供一些你知道发送者可能会传输的信息来实现--例如,这种事情在战时发生过。
因此,最好的加密算法可以防止攻击者推断出密钥,即使个人知道明文和密码文本。这让攻击者别无选择,只能尝试所有可能的密钥--详尽的、"蛮力 "的搜索。如果钥匙有n个比特,那么一个钥匙就有2的n次方个可能的值(n个比特中的每一个都可能是0或1)。攻击者可以很幸运地立即尝试正确的值,也可以很不幸运地在尝试了所有2的n次方可能的值后,在最终尝试钥匙的正确值之前尝试每一个不正确的值;发现正确值的平均猜测次数是在这两个极端的中间,即2的n/2次方。通过选择一个足够大的密钥空间,并使检查密钥的操作具有合理的成本,这在计算上是不现实的。导致这种情况的原因是,计算速度不断提高,使以前不可行的计算变得可行。此外,尽管我们专注于数据在网络中移动时的安全性--也就是说,数据有时只在很短的时间内是脆弱的,但一般来说,安全人员必须考虑需要在档案中储存几十载的数据的脆弱性。这就证明了一个慷慨的大钥匙尺寸。另一方面,较大的密钥会使加密和解密速度变慢。
大多数密码是块状密码;它们被定义为将某个固定大小的明文块作为输入,通常是64到128位。使用区块密码对每个区块进行独立加密,即所谓的电子密码本(ECB)模式加密,其弱点是给定的明文区块值将始终导致相同的密码文本区块。因此,明文中重复出现的块值在密文中也是可以识别的,这使得密码分析员更容易破解密码。
为了防止这种情况,区块密码总是被增强,以使一个区块的密码文本根据上下文而变化。区块密码被增强的方式被称为操作模式。一个常见的操作模式是密码块链(CBC),其中每个明文块在被加密前与前一个块的密码文本进行XOR。其结果是,每个区块的密码文本部分取决于前面的区块(即,其上下文)。由于第一个明文区块没有前面的区块,它与一个随机数进行XOR。该随机数,称为初始化向量(IV),与一系列的密码文本块一起被包括在内,以便第一个密码文本块可以被解密。这种模式如图196所示。另一种操作模式是计数器模式,其中计数器的连续值(例如,1、2、3。
)被纳入连续的明文块的加密中。
8.2.2 秘钥密码
在密匙密码中,通信的两个参与者共享相同的密钥。1 换句话说,如果一个信息是用一个特定的密钥加密的,那么解密该信息也需要相同的密钥。如果图195所示的密码是一个秘密钥匙密码,那么加密和解密的钥匙将是相同的。秘密钥匙密码也被称为对称钥匙密码,因为秘密是与双方参与者共享的。我们很快就会看一下另一种方式,即公开密钥密码。(公钥密码也被称为非对称钥匙密码,因为我们很快就会看到,两个参与者使用不同的钥匙)。
1
我们用 "参与者 "一词来表示参与安全通信的各方,因为这也是我们在本书中一直使用的术语,以确定通道的两个端点。在安全领域,他们通常被称为委托人。
美国国家标准与技术研究所(NIST)已经发布了一系列密匙密码的标准。数据加密标准(DES)是第一个,它经受住了时间的考验,没有发现比蛮力搜索更好的密码分析攻击。然而,蛮力搜索已经变得更快。鉴于目前的处理器速度,DES的密钥(56个独立比特)现在太小了。DES的密钥有56个独立位(尽管它们总共有64位;每个字节的最后一位是奇偶校验位)。如上所述,你平均要搜索256个可能的密钥空间的一半才能找到正确的密钥,即255=3.6×1016个密钥。这听起来似乎很多,但这样的搜索是高度可并行的,所以你有可能把尽可能多的计算机扔到这个任务上,而现在你很容易就能找到成千上万的计算机。(亚马逊会以每小时几美分的价格把它们租给你。)到20世纪90年代末,已经有可能在几个小时后恢复DES密钥。因此,NIST在1999年更新了DES标准,指出DES应该只用于遗留系统。
NIST还对密码三重DES(3DES)进行了标准化,它利用了DES的密码分析能力,同时实际上增加了密钥的大小。一个3DES密钥有168(=3×56)个独立的比特,并被用作三个DES密钥;我们称它们为DES-密钥1、DES-密钥2和DES-密钥3。 3DES对一个区块的加密是通过首先使用DES-密钥1对区块进行加密,然后使用DES-密钥2对结果进行解密,最后使用DES-密钥3对该结果进行加密。解密包括使用DES-key3解密,然后使用DES-key2加密,再使用DES-key1解密。
3DES加密使用DES-key2解密的原因是为了与传统的DES系统互通。如果一个传统的DES系统使用一个单一的密钥,那么3DES系统可以通过对DES-密钥1、DES-密钥2和DES-密钥3中的每一个使用该密钥来执行相同的加密功能;在前两个步骤中,我们用同一个密钥进行加密和解密,产生原始明文,然后我们再进行加密。
尽管3DES解决了DES的密钥长度问题,但它也继承了其他一些缺点。DES/3DES的软件实现很慢,因为它最初是由IBM设计的,用于在硬件中实现。另外,DES/3DES使用64位的区块大小;更大的区块大小更有效、更安全。
3DES现在已经被NIST发布的高级加密标准(AES)标准所取代。作为AES基础的密码(有一些小的修改)最初被命名为Rijndael(发音大致类似于 "Rhine dahl"),是基于其发明者的名字,Daemen和Rijmen。AES支持128、192或256位的密钥长度,块长度为128位。AES允许在软件和硬件中快速实现。它不需要太多的内存,这使得它适用于小型移动设备。AES有一些在数学上被证实的安全特性,截至本文撰写之时,还没有遭受过任何重大的成功攻击。
认证
.... RSA 签名
另一种认证器也是类似的,但它不是对哈希值进行加密,而是使用一个类似哈希值的函数,将一个秘密值(只有发送方和接收方知道)作为一个参数,如图199所示。这样的函数会输出一个称为信息认证码(MAC)的认证器。发送方将MAC附加到她的明文信息中。接收者使用明文和秘密值重新计算MAC,并将重新计算的MAC与收到的MAC进行比较。
MAC的一个常见变化是对明文信息和秘密值的连接应用一个加密散列(如MD5或SHA-1),如图199所示。由此产生的摘要被称为散列消息认证码(HMAC),因为它本质上是一个MAC。HMAC,但不是秘密值,被附加到明文上。只有知道秘密值的接收者才能计算出正确的HMAC,与收到的HMAC进行比较。如果不是因为哈希的单向属性,对手可能会找到生成HMAC的输入,并将其与明文信息进行比较,以确定秘密值。
到此为止,我们一直假设信息不是保密的,所以原始信息可以作为明文传输。为了给带有认证器的消息增加保密性,只需对包括认证器在内的整个消息的连接进行加密--MAC、HMAC或加密摘要。请记住,在实践中,保密性是使用密匙密码实现的,因为它们比公匙密码快得多。此外,在加密中包含验证器的成本很低,而且可以提高安全性。一个常见的简化方法是用信息的(原始)摘要进行加密,这样,摘要只被加密一次;在这种情况下,整个密码文本信息被认为是一个认证器。
尽管认证器似乎可以解决认证问题,但我们将在后面的章节中看到,它们只是解决方案的基础。然而,首先,我们要解决参与者如何首先获得钥匙的问题。