深入浅出密码学
上QQ阅读APP看书,第一时间看更新

1.4 非对称加密:两个密钥优于一个密钥

在前面关于对称加密的讨论中,我们曾提到:Alice和Bob在安全传递信件前需要见面,以确定他们将要使用的对称加密密钥。这是一个合理的要求,许多协议实际上都有这样的前提要求。然而,这样的要求在有许多参与者的协议中很快变得不那么实用:在安全连接到谷歌、Facebook、亚马逊和其他数十亿网站之前,网络浏览器是否也要满足这样的要求(即在连接前,浏览器之间要相互确定使用的对称加密密钥)?

这也称为密钥分发问题,在相当长的一段时间内该问题都未被解决,直到20世纪70年代末密码学家发现了另一类称为非对称密码(Asymmetric Cryptography)或公钥密码(Public Key Cryptography)的算法,密钥分发问题才得以解决。在非对称密码中,不同的函数(ENCRYPT和DECRYPT)使用不同的密钥(对称密码仅使用单个密钥)。为了说明公钥密码如何帮助人们建立信任,我将在本节介绍一些非对称密码原语。注意,这些原语只是本书内容的概览,在后续章节中我们会更详细地讨论这些密码原语。

1.4.1 密钥交换

我们学习的第一个非对称密码原语是密钥交换(Secret Key Exchange)。DH密钥交换算法是密码学家提出的第一个公钥密码算法,该算法以其提出者(Diffie和Hellman)的名字的首字母命名。DH密钥交换算法的主要目的是为通信双方生成一个共享的秘密。这个双方共享的秘密可以用于不同的目的,例如作为对称加密原语的密钥。

在第5章中,我将详细解释DH密钥交换的工作原理。在本小节我们使用一个简单的类比来解释密钥交换。与大多数密码算法一样,在密钥交换算法执行前,参与者也必须获得一组公共参数。在类比说明中,我们用正方形■表示Alice和Bob协商好的公共参数(公共形状)。接下来,他们各自找到一个秘密地点,并随机选择一个形状。假设Alice选择的形状是三角形▲,而Bob选择的是星形★,同时他们会不惜一切代价地保密自己所选的形状。这些随机选择的形状就是他们各自的私钥(Private Key),如图1.7所示。

图1.7 在DH密钥协商的第一步,双方生成私钥。在类比说明中,Alice的私钥是三角形,Bob的私钥是星形

当Alice和Bob选择完私钥后,他们就各自将他们随机选择的形状与他们起初协商的公共形状(正方形)结合起来。这些组合会产生唯一的新形状,每个新形状表示一个公钥(Public Key)。公钥属于公开信息,因此Alice和Bob可以相互交换他们的公钥。该过程说明如图1.8所示。

现在我们来思考这个算法为什么属于公钥密码算法。这是因为此类密码算法的密钥由一个公钥和一个私钥组成。DH密钥交换算法的最后一步相当简单,即Alice和Bob分别将对方的公钥和自己的私钥结合在一起。最终,双方得到完全相同的结果(形状)。在所给的类比示例中,由正方形、星形和三角形组合在一起产生的形状如图1.9所示。

图1.8 在DH密钥协商的第二步,双方交换公钥。双方通过将公共形状和私钥结合在一起来生成公钥

图1.9 在DH密钥协商的最后一步:双方生成共享密钥。为了生成这个密钥,双方都将对方的公钥和自己的私钥结合在一起,而且仅仅通过两个公钥无法生成共享密钥

之后,协议的参与者可以使用这个共享密钥。本书也包含许多共享密钥使用场景的例子。例如,Alice和Bob可以将共享密钥当作对称加密算法的密钥,进而使用这个对称加密原语去加密消息。DH密钥交换的整个过程概括如下:

(1)Alice和Bob交换掩盖了他们各自私钥的公钥;

(2)双方均使用对方的公钥和己方的私钥计算出共享密钥;

(3)敌手通过观察公钥不能获得私钥的任何信息,更不能计算出共享密钥。

注意:

在所给示例中,敌手很容易绕过最后一个问题。因为在不知道私钥的情况下,我们可以将公钥结合在一起生成共享密钥。幸运的是,这只是类比示例本身的局限性,而且并不影响我们理解密钥交换的内部原理。

实际上,DH密钥交换是非常不安全的。你能花上几秒找出其不安全的原因吗?

这是因为Alice接收任何来自Bob的公钥,所以我可以拦截Bob发向Alice的公钥,并用我的公钥替换掉Bob的公钥,这样我就可以冒充Bob(反之,我也可以向Bob冒充Alice)。这样的中间人(Man-in-the-Middle,MITM)攻击者方法可以成功地攻击该密钥交换协议。那么如何修复协议的这个漏洞呢?在第2章我们会看到,修复该协议有两种方法,即用另一个加密原语增强这个密钥交换协议,或者提前知道Bob的公钥。但这不就意味着我们又回到了原点,即如何在协议开始之前确定双方公钥?

先前我们提到,Alice和Bob需要知道一个共同的密钥;现在,我们又要求,Alice和Bob需要事先知道彼此的公钥。双方如何才能知道对方的公钥呢?这不就是一个先有鸡还是先有蛋的问题吗?是的,的确如此。正如我们将看到的一样,在实践中,公钥密码并不能解决信任问题,它只是简化了信任的建立难度(特别是参与者数量有很多时)。

现在,让我们用图 1.10 来汇总目前学到的内容。我们停止讨论该话题,转而继续学习1.4.2小节内容。在第5章中,我们会了解更多关于密钥交换的内容。

图1.10 到目前为止,我们学到的密码算法分属两大类,即对称密码(包含对称加密)和 非对称密码(包含密钥交换)

1.4.2 非对称加密

在DH密钥交换算法提出后不久,密码学家Ron Rivest、Adi Shamir和Leonard Adleman又提出了一个新的密码算法,该算法也以他们的名字命名,称为RSA算法。RSA算法包含两类不同的密码学原语:公钥加密(或非对称加密)算法和(数字)签名算法。这两个密码算法属于非对称密码中两类不同的密码学原语。在本小节中,我们将解释这些原语的功能以及它们在密码协议里发挥的作用。对于非对称加密,其功能与我们前面讨论的对称加密算法类似:它通过加密消息来保证机密性。不过,对称加密中两个参与方使用相同的密钥加密和解密消息,但在非对称加密中加密和解密消息的方式则完全不同:

非对称加密有两个密钥,分别称为公钥和私钥;

任何人都可以使用公钥加密消息,但是只有私钥拥有者才可以解密消息。

现在,我们用另外一个简单的类比示例来解释非对称加密的使用方法。我们再次从我们的老朋友Alice谈起,假设她持有私钥及其对应的公钥。我们把她的公钥想象成一个打开的盒子,它向公众敞开,任何人均可使用它,如图1.11所示。

图1.11 为了使用非对称加密,Alice首先公开她的公钥(这里用打开的盒子来表示)。任何人都可以使用这个公钥加密向她发送的消息。Alice可以使用私钥解密收到的加密消息

任何人都可以使用Alice的公钥加密发向她的消息。在类比说明中,我们将加密消息想象成把消息放到打开的盒子里并关上它。一旦盒子关上,除了Alice,任何人都没法打开放有消息的盒子。这个盒子有效地保证了消息的机密性,避免第三方获得消息本身。Alice收到关闭的盒子(加密的消息)后,她可以用只有自己知道的私钥打开盒子(解密消息),获得消息,如图1.12所示。

图1.12 非对称加密:(1)任何人都可以用Alice的公钥加密发给她的消息;(2)接收到加密的消息后; (3)她可以用对应的私钥解密,获得消息本身,第三方没法直接观察到发给Alice的消息

我们用图 1.13 总结了到目前为止学到的密码学原语。距离实用密码学之旅结束,我们需要学习的密码学原语只差一个!

图1.13 到目前为止,我们学到的密码算法分属两大类,即对称密码(包含对称加密)和 非对称密码(包含密钥交换和非对称加密)

1.4.3 数字签名:与手写签名作用一样

在1.4.2小节,我们了解了由RSA算法衍生出的非对称加密算法。同时提到,RSA算法还能实现数字签名。数字签名原语能够有效地帮助Alice和Bob建立起信任,它的作用与手写签名十分类似。例如,当租赁公寓时,我们需要在租住合同上签字。

我们可能会产生这样的疑问:如果他们伪造我的签名怎么办?确实,手写签名在现实世界中并不能提供足够的安全性。密码上的签名也可能伪造,但是密码签名还会提供一个带有签名者姓名的密码证书。这能保证密码签名不可伪造,进而让别人很容易验证签名。与在支票上写的古老签名相比,密码签名更加有用!

在图1.14中,我们想象这样一个场景:Alice想向David证明她信任Bob。这是一个在多方环境中建立信任以及非对称密码技术使用场景的典型例子。Alice通过在一张写有“Alice信任Bob”的纸上签名来表明立场,并告诉David:Bob是可以信任的。如果David信任Alice和她的签名算法,那么他也可以选择信任Bob。

具体来说,就是Alice用她的RSA签名算法以及私钥对消息“Alice信任Bob”签名。这会产生一个类似随机噪声的签名,如图1.15所示。

图1.14 David信任Alice。如果Alice信任Bob,那么David也可以信任Bob吗

图1.15 Alice用她的私钥生成消息的签名

任何人都可以通过以下信息验证这个签名:

(1)Alice公钥;

(2)待签消息;

(3)消息的签名。

验证结果只能是真(签名有效)或者假(签名无效),如图1.16所示。

图1.16 为了验证Alice的签名,验证者还需要待签消息本身和Alice的公钥。验证结果只能是签名有效或者无效

到现在为止,我们已经学了3个不同的非对称密码原语:

(1)DH密钥交换;

(2)非对称加密;

(3)RSA数字签名。

这是3个非常著名且应用广泛的非对称密码算法。这些算法对于解决现实世界的安全问题所发挥的作用可能不会十分明显,但是这些算法确实每时每刻都在保护着我们所触及的各类应用。现在,让我们还用图来总结到目前为止我们学到的所有密码算法,如图1.17所示。

图1.17 到目前为止,我们学过的对称密码算法和非对称密码算法