谢邀。
今天(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进行操作。具体来说,对称加密拥有两个算法:
举个例子,如果一个小女孩儿Alice想和一个小男孩儿Bob进行秘密的通信,双方都有一个相同的密钥K的话,那么通信很容易就能实现:分别执行上述两个算法,两个人互相发互相收,其乐融融。
但是,人们一直都没法解决一个问题:怎么让双方都拥有一个相同的密钥K呢?通常的方法就是把K用各种方法秘密的传送给对方。比如使用鸡毛信啊,使用隐写笔什么的。这的确是一个不错的方法。但是,多数情况下通信双方很可能根本没法见面,或者没有任何方法可以快速地传递这个密钥K,比如现如今的互联网。如何解决这个问题呢?
=============================
2. 创新性的解决方法:公钥加密
一种方法不行,我们来看另一种方法。1977年,Rivest,Shamir和Adleman三个人提出了一种改变世界的加密方法:公钥加密(PublicKey Encryption),也成非对称加密(Asymmetric Encryption)。与密钥协商算法类似,在公钥加密中,接收方产生一个公钥/私钥对,公钥公开的告诉所有人,私钥自己保留。任何人在获得公钥后,都可以执行加密算法,用公钥对数据进行加密。只有拥有私钥的人才能够解密数据。公钥加密有三个算法:
这种方法很厉害,看似能够解决对称加密中的全部问题。但是这种方法有个最大的缺陷,就是无论公钥加密怎么设计,其加密的速度都会远远慢于对称加密。因此在实际中,人们更多地是利用公钥加密给对方发送一个密钥K,以后将密钥K作为对称加密的密钥进行通信。这样一来,既利用了公钥加密可以公开加密的特点,又利用了对称加密速度快的特点,一举两得。
如图所示,Alice和Bob可以用下述方法分享密钥K,并在随后使用对称加密进行通信。
公钥加密体制最大的特点就是,加密方可以使用公钥加密。但问题也出在了这里:任何人都可以获得这个公钥(因为公钥是公开的),那么任何人都可以利用这个方法将一个密钥K发送给Alice了。举个例子,Bob可以发送,一个小恶魔Eve也可以用相同的方法发送,如图所示:
这样一来,Alice根本无法区分收到的密文到底是Bob发送的还是Eve发送的。
=============================
3. 另一种方法,公开信道分享密钥:密钥交换协议
1976年,著名密码学家Diffie和Hellman提出了一个创新性的想法:我们是否可以公开地分享密钥呢?也就是说,通信双方都采用一个公开信道传递消息,但只有彼此才能够分享一个相同的密钥K。其他人即使获取到了公开信道中传递的任何消息,都无法计算出密钥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)。数字签名有三个算法:
签名算法与密钥协商算法的结合可以解决上述攻击方法。双方密钥协商时,再分别运行签名算法对自己发出的公钥apk进行签名。收到信息后,首先验证签名,如果签名正确,则继续进行密钥协商。注意到,由于签名算法中的公钥spk是一直公开的,攻击者没有办法阻止别人获取公钥,除非完全掐断发送方的通信。这样一来,中间人攻击就不存在了,因为Eve无法伪造签名。具体过程如图所示:
题主的问题,实际上就是将Diffie-Hellman密钥协商协议作为上述过程中的密钥协商协议;将RSA签名作为上述过程中的签名。以此,RSA和Diffie-Hellman进行了结合,完成了整个密钥协商过程,同时避免了中间人攻击。