请教DH算法在混合加密中,到底起什么作用?

在此请教高手了,我在学习PKI/RSA的过程中,遇到太多似懂非懂,似是而非的问题,也许密码学本身就比较难吧。 第一个问题是,在RSA算法中引入DH算法…
关注者
127
被浏览
44,253

9 个回答

谢邀。

今天(2015.8.29)晚上差不多19点就收到邀请了。刚看到题目的时候一愣,再看题目描述更是一头雾水。于是在评论区给题主发了个评论,不过未能得到回复。自己又想了一下,终于知道问题到底出在哪里了。我用我浅显的协议安全知识回答一下,如果有错误或者不严谨的地方,还请知乎er们在评论区留言,或者另开一个回答。我会随时更新答案。

=============================

0. 简答

题主之所以对视频中的讲解一头雾水,应该是视频中混淆了公钥加密/解密、数字签名的概念,特别是RSA公钥加密/解密、数字签名的概念。RSA算法实际上有两种使用方法:RSA加密、RSA签名。我个人已经看到了无数的讨论,无数的答案,都把数字签名也写成了加密/解密,比如“用私钥加密信息,用公钥解密信息”。因此,视频中的本意应该是:

用Diffie-Hellman密钥交换协议时,对于通信过程使用RSA进行数字签名,从而使得Diffie-Hellman密钥协商协议可以抵御中间人攻击。

也就是说,并非是RSA加密和Diffie-Hellman密钥协商协议结合,而是RSA签名和Diffie-Hellman密钥协商协议的结合

之所以有这样的混淆,是因为RSA用于加密和用于签名时,算法的执行流程是完全一样的!甚至,RSA中如果把公钥和私钥弄混了,算法照样可以执行,而且可以很顺利的执行。但是注意,只有RSA有这样的特性。后续提出的加密/签名算法中,几乎没有再有这样的特性了,公钥私钥不能调换使用。

有关RSA算法中,公钥私钥可以调换使用,请参考我的另一个答案:

RSA的公钥和私钥到底哪个才是用来加密和哪个用来解密? - 刘巍然-学酥的回答

=============================

为了让题主更清楚对称加密、公钥加密、密钥协商、数字签名,以及它们在现代通信系统中的具体使用方法,请看下面的介绍。注意,下面的介绍中没有给出具体的算法,而是将所有算法当做黑盒(Black-Box)使用。在实际操作中,将具体的算法套用其中,就可以得到具体的例子了。这样写可以避免歧义和混淆。

=============================

1. 最初的加密方式:对称加密方式

一直以来,人们一直使用的加密方式都是对称加密(Symmetric Encryption)。对称加密的意思是,通信双方有一个相同的密钥K。加密和解密时,双方都使用这个相同的密钥K进行操作。具体来说,对称加密拥有两个算法:

  • 加密算法SymEncrypt以密钥K和数据Data作为输入,输出密文CT。
  • 解密算法SymDecrypt以密钥K和密文CT作为输入,输出数据Data。

举个例子,如果一个小女孩儿Alice想和一个小男孩儿Bob进行秘密的通信,双方都有一个相同的密钥K的话,那么通信很容易就能实现:分别执行上述两个算法,两个人互相发互相收,其乐融融。


但是,人们一直都没法解决一个问题:怎么让双方都拥有一个相同的密钥K呢?通常的方法就是把K用各种方法秘密的传送给对方。比如使用鸡毛信啊,使用隐写笔什么的。这的确是一个不错的方法。但是,多数情况下通信双方很可能根本没法见面,或者没有任何方法可以快速地传递这个密钥K,比如现如今的互联网。如何解决这个问题呢?

=============================

2. 创新性的解决方法:公钥加密

一种方法不行,我们来看另一种方法。1977年,Rivest,Shamir和Adleman三个人提出了一种改变世界的加密方法:公钥加密(PublicKey Encryption),也成非对称加密(Asymmetric Encryption)。与密钥协商算法类似,在公钥加密中,接收方产生一个公钥/私钥对,公钥公开的告诉所有人,私钥自己保留。任何人在获得公钥后,都可以执行加密算法,用公钥对数据进行加密。只有拥有私钥的人才能够解密数据。公钥加密有三个算法:

  • 密钥生成算法EGen输出一个公钥和私钥对(epk, esk),esk需要秘密地保存,epk可以公开。
  • 公钥加密算法AsymEncrypt以公钥epk和数据data作为输入,输出密文CT。
  • 公钥解密算法AsymDecrypt以私钥esk和密文CT作为输入,输出数据data。

这种方法很厉害,看似能够解决对称加密中的全部问题。但是这种方法有个最大的缺陷,就是无论公钥加密怎么设计,其加密的速度都会远远慢于对称加密。因此在实际中,人们更多地是利用公钥加密给对方发送一个密钥K,以后将密钥K作为对称加密的密钥进行通信。这样一来,既利用了公钥加密可以公开加密的特点,又利用了对称加密速度快的特点,一举两得。

如图所示,Alice和Bob可以用下述方法分享密钥K,并在随后使用对称加密进行通信。



公钥加密体制最大的特点就是,加密方可以使用公钥加密。但问题也出在了这里:任何人都可以获得这个公钥(因为公钥是公开的),那么任何人都可以利用这个方法将一个密钥K发送给Alice了。举个例子,Bob可以发送,一个小恶魔Eve也可以用相同的方法发送,如图所示:

这样一来,Alice根本无法区分收到的密文到底是Bob发送的还是Eve发送的。

=============================

3. 另一种方法,公开信道分享密钥:密钥交换协议

1976年,著名密码学家Diffie和Hellman提出了一个创新性的想法:我们是否可以公开地分享密钥呢?也就是说,通信双方都采用一个公开信道传递消息,但只有彼此才能够分享一个相同的密钥K。其他人即使获取到了公开信道中传递的任何消息,都无法计算出密钥K。密钥交换协议拥有两个算法:

  • 密钥生成算法AGen输出一个公钥和私钥对(apk, ask),ask需要秘密地保存,apk可以公开发送给对方。
  • 密钥协商算法Agree以一方的公钥apk和自己的私钥ask作为输入,计算出一个密钥K。

这样一来,Alice和Bob就可以用这个协议在公开信道上面分享一个相同的密钥K。随后用这个K作为对称加密算法的密钥,互相之间愉快地通信了。


我们可以注意到,密钥交换协议的提出是早于公钥加密的。实际上,Rivest,Shamir和Adleman三个人的是以Diffie和Hellman的工作作为启发才提出的公钥加密。

这种密钥协商方法虽然很好,但仍然有一个类似的问题,攻击者仍然可以利用公钥公开的特性攻击。当Bob将他的apk发送给Alice时,攻击者可以截获apk,自己运行AGen算法产生一个公钥/私钥对,然后把他产生的公钥发送给Alice。同理,攻击者可以截获Alice发送给Bob的apk,再运行AGen算法,并把这个公钥发送给Bob。Alice和Bob仍然可以执行协议,产生一个密钥K。但实际上,Alice产生的密钥K实际上是和攻击者协商的;Bob产生的密钥K也是和攻击者协商的。

描述起来有点复杂,我们上图。一个小恶魔Eve,可以按照下图的方法实现这一攻击:

因为这种方法,小恶魔Eve处于Alice和Bob中间的位置,因此这种攻击方法叫作中间人攻击(man in the middle attack)。

=============================

4. 终极解决方法:密钥协商+签名

Rivest,Shamir和Adleman三个人还提出了一个更为创新性的想法:既然我们可以用公钥加密数据,私钥解密数据,那么我们是否可以用私钥“加密”数据,公钥“解密”数据呢?这看起来毫无意义,既然公钥可以“解密”数据,那岂不是任何人都能够解密了?这个方法的奇妙之处在于,数据只能用私钥“加密”,那么我们把加密结果作为一种认证方式。如果公钥可以“解密”,就认为这个数据只能由拥有私钥的一方“加密的”,这就可以确认,这个数据是由拥有私钥的人发送出来的。

这种方式由于和人们签字的方法很像,因此这种方法被称为数字签名(Digital Signature)。数字签名有三个算法:

  • 密钥生成算法SGen输出一个公钥和私钥对(spk, ssk),ssk需要秘密地保存,spk可以公开。
  • 签名算法Sign以私钥ssk和要签名的数据data作为输入,输出一个签名Sigma。
  • 验证算法Verify以公钥spk和签名Sigma作为输入,验证通过则输出1,否则输出0。

签名算法与密钥协商算法的结合可以解决上述攻击方法。双方密钥协商时,再分别运行签名算法对自己发出的公钥apk进行签名。收到信息后,首先验证签名,如果签名正确,则继续进行密钥协商。注意到,由于签名算法中的公钥spk是一直公开的,攻击者没有办法阻止别人获取公钥,除非完全掐断发送方的通信。这样一来,中间人攻击就不存在了,因为Eve无法伪造签名。具体过程如图所示:

题主的问题,实际上就是将Diffie-Hellman密钥协商协议作为上述过程中的密钥协商协议;将RSA签名作为上述过程中的签名。以此,RSA和Diffie-Hellman进行了结合,完成了整个密钥协商过程,同时避免了中间人攻击。

时至2019年2月2日,之前的答案都错了。什么中间人攻击之类的都是错的。杜绝中间人攻击的是CA认证,而不仅仅是DH算法就能搞定的。

题主问的是明明在混合加密中RSA已经可以实现密钥交换了,为什么还要DH算法。

其实答案在https(ssl/tls)协议中很明显地说明了,协议中定义了一系列密码套件(Cipher suite)。

这些套件分别使用了RSA、DH、DHE(EDH,临时DH)、ECDH(椭圆曲线版DH)作为密钥交换算法,而前两者和后两者的区别就是后两者支持前向安全(Forward Secrecy,缩写:FS),有时也被称为完美前向安全(英语:Perfect Forward Secrecy,缩写:PFS)。也因此,不再推荐使用前两者的密码套件了。

即,RSA作为密钥交换,只要私钥泄露,如果以前的所有通讯内容被留存,那就可以得到对称密钥同时得到所有通讯明文。而DHE或者ECDH,因为是通讯时双方共同算出的临时对称密钥,则不存在此安全性问题。