文章目录
前言
阅读本文前请注意最后编辑时间,文章内容可能与目前最新的技术发展情况相去甚远。欢迎各位评论与私信,指出错误或是进行交流等。
本文是关于《计算机网络:自顶向下方法(第七版)》的学习分享,内容书写顺序也是按照书中的顺序。本文并不会提及书中的所有内容,主要写重点的知识,以及自己感兴趣的内容。会对原文中的内容进行一定的精简,或者加上个人的理解。
计算机网络中的安全
什么是网络安全
安全通信具有下列所需要的特性。
- 机密性 (confidentiality) 。 仅有发送方和希望的接收方能够理解传输报文的内容。因为窃听者可以截获报文,这必须要求报文在一定程度上进行加密 (encrypted) , 使截取的报文无法被截获者所理解。
- 报文完整性 (message integrity) 。 通信的内容在传输过程中未被改变------或者恶意篡改或者意外改动。 我们在可靠传输和数据链路协议中遇到的检验和技术在扩展后能够用于提供这种报文完整性
- 端点鉴别 (end-point authentication) 。 发送方和接收方都应该能证实通信过程所涉及的另一方,以确信通信的另一方确实具有其所声称的身份。 人类的面对面通信可以通过视觉识别轻易地解决这个问题。 当通信实体在不能看到对方的媒体上交换报文时,鉴别就不是那么简单了。
- 运行安全性 (operational security) 。 几乎所有的机构(公司 、大学等)今天都有了与公共因特网相连接的网络。 这些网络都因此潜在地能够被危及安全。 攻击者能够试图在网络主机中安放蠕虫,获取公司秘密,勘察内部网络配置并发起DoS攻击。 诸如防火墙和入侵检测系统等运行设备正被用于反制对机构网络的攻击。 防火墙位于机构网络和公共网络之间,控制接入和来自网络的分组。 入侵检测系统执行"深度分组检查"任务,向网络管理员发出有关可疑活动的警告。
明确了我们所指的网络安全的具体含义后,接下来考虑入侵者可能要访问的到底是哪些信息,以及入侵者可能采取哪些行动。 下图阐述了一种情况。 Alice (发送方)想要发送数据给Bob (接收方)。 为了安全地交换数据,即在满足机密性、 端点鉴别和报文完整性要求的情况下, Alice和 Bob 交换控制报文和数据报文 ( 以非常类似于TCP 发送方和接收方双方交换控制报文和数据报文的方式进行)。 通常将这些报文全部或部分加密。 入侵者能够潜在地执行下列行为:
- 窃听:监听并记录信道上传输的控制报文和数据报文
- 修改、插入或删除报文或报文内容。

如我们将看到的那样、除非采取适当的措施,否则上述能力使入侵者可以用多种方式发动各种各样的安全攻击: 窃听通信内容(可能窃取口令和数据),假冒另一个实体,"劫持" 一个正在进行的会话,通过使系统资源过载拒绝合法网络用户的服务请求等等。
已经知道在因特网中某处的确存在真实的威胁,则 Alice 和 Bob (两个需要安全通信的朋友)在因特网上的对应实体是什么呢?当然, Alice 和 Bob 可以是位于两个端系统的人类用户,例如,真实的Alice 和真实的 Bob 真的需要交换安全电子邮件。 他们也可以参与电子商务事务。 例如,真实的 Bob希望安全地向一台 Web服务器传输他的信用卡号码,以在线购买商品。 类似地,真实的 Alice要与银行在线交互。 需要安全通信的各方自身也可能是网络基础设施的一部分。 前面讲过,域名系统 (DNS)或交换路由选择信息的路由选择守护程序需要在两方之间安全通信。 对于网络管理应用也有相同的情况, 主动干扰DNS查找和更新、路由选择计算或网络管理功能的入侵者能够给因特网造成不可估量的破坏,
建立了上述框架,明确了一些重要定义以及网络安全需求之后,我们将深入学习密码学。 应用密码学来提供机密性是不言而喻的,同时我们很快将看到它对于提供端点鉴别报文完整性也起到了核心作用,这使得密码学成为网络安全的基石。
密码学的原则
尽管密码学的漫长历史可以追溯到朱利叶斯· 凯撒 (Julius Caesar) 时代,但现代密码技术(包括今天的因特网中正在应用的许多技术)基于过去30年所取得的进展。 我们只能初步了解密码学的基本方面,特别是因为这些东西正在今天的因特网上发挥作用。 我们也注意到,尽管本节的重点是密码学在机密性方面的应用,但我们将很快看到密码学技术与鉴别、报文完整性和不可否认性等是紧密相关的。
密码技术使得发送方可以伪装数据,使入侵者不能从截取到的数据中获得任何信息。当然,接收方必须能够从伪装的数据中恢复出初始数据。 下图说明了一些重要的术语。

现在假设Alice 要向 Bob 发送一个报文。 Alice 报文的最初形式(例如, "Bob, I love you. Alice") 被称为明文 (plaintext, cleartext) 。Alice 使用加密算法 (encryption algorithm) 加密其明文报文,生成的加密报文被称为密文 (cipherlext) , 该密文对任何入侵者看起来是不可懂的。 有趣的是在许多现代密码系统中,包括因特网上所使用的那些,加密技术本身是已知的,即公开发行的、标准化的和任何人都可使用的, 即使对潜在的入侵者也是如此! 显然,如果任何人都知道数据编码的方法,则一定有一些秘密信息可以阻止入侵者解密被传输的数据。 这些秘密信息就是密钥。
在图中, Alice 提供了一个密钥 (key) KA, 它是一串数字或字符,作为加密算法的输入。 加密算法以密钥和明文报文m为输入,生成的密文作为输出。 用符号KA(m) 表示(使用密钥KA加密的)明文报文m的密文形式。 类似地, Bob将为解密算法 (decryption algorithm) 提供密钥 KB将密文和 Bob 的密钥作为输入,输出初始明文。 也就是说,如果Bob接收到一个加密的报文KA(m) , 他可通过计算KB(KA (m)) = m 进行解密。 在对称密钥系统 (symmetric key system) 中, Alice 和 Bob的密钥是相同的并且是秘密的。 在公开密钥系统 (public key system, 也称为公钥系统)中,使用一对密钥: 一个密钥为Bob和Alice 俩人所知(实际上为全世界所知),另一个密钥只有Bob 或 Alice 知道(而不是双方都知道)。
对称密钥密码体制
所有密码算法都涉及用一种东西替换另一种东西的思想。例如,取明文的一部分进行计算,替换适当的密文以生成加密的报文。在分析现代基于密钥的密码系统之前,我们首先学习一下凯撒密码 (Caesar cipher) 找找感觉,这是一种加密数据的方法。这种非常古老而简单的对称密钥算法由 Julius Caesar发明。凯撒密码用于英语文本时,将明文报文中的每个字母用字母表中该字母后第k个字母进行替换(允许回绕,即把字母 "a" 排在字母 "z" 之后)。 例如,如果k:=3, 则明文中的字母 "a" 变成密文中的字母 "d"; 明文中的字母 "b" 变成密文中的字母"e" 依此
类推。 因此, k 的值就作为密钥。 举一个例子,明文报文 "bob, i love you. alice" 在密文中变成 "ere , l oryh brx, dolfh" 。 尽管密文看起来像乱码,但如果你知道使用了凯撒密码加密,因为密钥值只有25个,所以用不了多久就可以破解它。
凯撒密码的一种改进方法是单码代替密码, 即使用字母表中的一个字母替换该字母表中的另一个字母。 然而,并非按照规则的模式进行替换(例如,明文中的所有字母都用偏移量为k 的字母进行替换),只要每个字母都有一个唯一的替换字母,任一字母都可用另一字母替换,反之亦然。如下为加密明文的一种可行替换规则。

明文报文 "bob, i love you. alice., 变成 'nkn, s gktc wky. mgsbc" - 因此、与用凯撒密码情况一样,这看起来像乱码,单码代替密码的性能看来要比凯撒密码的性能好得多,可能的字母配对为26!(10^26数量级) ,而不是25 种。尝试所有可能配对的蛮力法要求的工作量太大,不是一种破解加密算法和解密报文的可行方式。 但是,通过对明文语言进行统计分析,例如,在典型的英语文本中,由于已知字母 "e" 和字母 "t" 出现的频率较高(这些字母出现的频率分别为 13%和9%),并且常见的两三个字母的组合通常一起出现(例如, "in" "it" "the" "ion" "ing" 等等),这就使得破解该密文变得相对容易。 如果入侵者具有该报文相关内容的知识,则破解该密码就会更为容易。例如,如果入侵者 Trudy 是 Bob 的妻子,怀疑 Bob 和 Alice 有暧昧关系,则她猜想 "bob" 和alice" 这些名字可能会出现在密文中。 如果 Trudy 确信这两个名字出现在密文中,并有了上述报文的密文副本,则她能够立即决定这26 个字母配对中的7 个,比蛮力法少检查多种可能性。
当考虑Trudy 破解 Bob 和 Alice 之间加密方案的难易程度时,可以根据入侵者所拥有的信息分为三种不同的情况。
- 唯密文攻击。 有些情况下,入侵者只能得到截取的密文,也不了解明文报文的内容。我们已经看到,统计分析有助于对加密方案的唯密文攻击 (ciphertext-only attack)。
- 已知明文攻击。 前面已经看到,如果Trudy 以某种方式确信在密文报文中会出现"bob" 和 '"alice" , 她就可以确定字母 a、 l、 i、 c、 e、 b 和 o 的( 明文,密文)匹配关系。 Trudy 也可能会幸运地记录下传输的所有密文,然后在一张纸上找到Bob 写下的已解密的明文。 当入侵者知道(明文,密文)的一些匹配时,我们将其称为对加密方案的已知明文攻击 (known-plaintext attack) 。
- 选择明文攻击。 在选择明文攻击 (chosen-plain text attack) 中 ,入侵者能够选择某一明文报文并得到该明文报文对应的密文形式。 对于我们前面所说的简单加密算法来说,
500 年前,发明了多码代替密码 (polyalphabetic encryption) , 这种技术是对单码代替密码的改进。 多码代替密码的基本思想是使用多个单码代替密码,一个单码代替密码用于加密某明文报文中一个特定位置的字母。 因此,在某明文报文中不同位置出现的相同字母可能以不同的方式编码。 下方显示了多码代替密码机制的一个例子。 它使用两个凯撒密码(其中 k =5 和k=19), 如图中不同的行所示。 我们可以选择使用这两个凯撒密码C1 和C2 。加密时采用以 C1 , C2, C2, C1 , C2 的次序循环的模式, 即明文的第一个字母用 C1 编码,第二和第三个字母用C2 编码,第四个字母用 C1编码,第五个字母用 C2 编码, 然后循环重复该模式,依此类推。 在这个例子中, 加密和解密 "密钥"是两个凯撒密码密钥 (k=5 和k = 19) 和 c1 , c2 , c2 , c1 , c2 的次序模式的知识。

- 块密码
我们现在回到现代社会中,考察对称密钥加密的工作方式。对称加密技术有两种宽泛的类型:流密码 (stream cipher) 和块密码 (hlock cipher) 。 在本节中,我们关注块密码,该密码用在多种因特网协议的加密中,包括PGP (用于安全电子邮件)、 SSL (用于使TCP连接更安全)和 IPsec (用于使网络层传输更安全)。
在块密码中,要加密的报文被处理为K 比特的块。例如,k=64, 则报文被划分为64 比特的块, 每块被独立加密。 为了加密一个块,该密码采用了一对一映射,将K 比特块的明文映射为K 比特块的密文。 我们来看一个例子。 假设k=3, 因此块密码将3 比特输入 (明文)映射为3 比特输出 (密文)。 下表给出了一种可能的映射。 注意到这是一个一对一的映射,即对每种输入有不同的输出。 这种块密码将报文划分成3 比特的块并根据映射关系进行加密。 可以验证,报文0101 1 000 1 1 1 1 被加密成了 101000111001 。

继续这个3 比特块的例子,注意到上述映射只是许多可能映射中的一种。 有多少种可能的映射呢?要回答这个问题,观察到一个映射只不过是所有可能输入的排列。 共有8 种可能的输入 (排列在"输入"栏中)。 这 8 种输入能够排列为 8! =40 320 种不同方式。 因此这些排列的每种都定义了一种映射, 共有40320种可能的映射。 我们能够将这些映射的每种视为一个密钥,即如果Alice 和Bob都知道该映射(密钥),他们能够加密和解密在他们之间发送的报文。
对这种密码的蛮力攻击即通过使用所有映射来尝试解密密文。 仅使用40320种映射(当 k =3) , 这能够在一台桌面PC 上迅速完成。 为了挫败蛮力攻击,块密码通常使用大得多的块,由 64 比特甚至更多比特组成。 注意到对于通常的K 比特块密码,即使不大的K值(如k=64) , 映射数量也是一个天文数字。
如刚才所述, 尽管块密码对于不大的K值能够产生健壮的对称密钥加密方案,但不幸的是它们难以实现。 对于k=64和给定的映射,将要求Alice和 Bob维护一张具有2^64个输入值的表,这是一个难以实现的任务。 此外,如果Alice和 Bob要改变密钥,他们将不得不每人重新生成该表。 因此,块密码在所有输入和输出之间提供了预先决定的映射(如在上述例子中那样),这简直是不可能实现的事。
取而代之的是,块密码通常使用函数模拟 随机 排列表。 在下图中显示了当k=64时这种函数的一个例子。 该函数首先将 64 比特块划分为 8 个块,每个块由 8 比特组成。 每个8 比特块由一个 "8 比特到8 比特"表处理,这是个可管理的长度。 例如,第一个块由标志为T1 的表来处理。 接下来,这8个输出块由置乱函数打乱顺序后,再装配成一个64 比特的块。 该输出被回馈到64 比特的输入, 开始了第二次循环。 经n次这样的循环后,该函数提供了一个64 比特的密文块。 这种循环的目的是使得每个输入比特影响最后输出比特的大部分 (即使不是全部)。 这种块密码算法的密钥将是8张排列表(假定置乱函数是公共已知的)。
目前有一些流行的块密码,包括DES (Data Encryption Standard , 数据加密标准)、3DES 和 AES (Advanced Encryption Standard , 高级加密标准) 。 这些标准都使用了函数( 而不是预先决定的表)。 这些算法也都使用了比特串作为密钥。 一个算法的密钥决定了特定"小型表"映射和该算法内部的排列。 对这些密码进行蛮力攻击要循环通过所有密钥,用每个密钥应用解密算法。 如果用 1 秒破解56 比特 DES 的计算机 (就是说,每秒尝试所有256个密钥)来破解一个128 比特的 AES 密钥,要用大约 149 万亿年的时间才有可能成功。 - 密码块链接
在计算机网络应用中,通常需要加密长报文(或长数据流)。 如果使用前面描述的块密码,通过直接将报文切割成K 比特块并独立地加密每块,将出现一个微妙而重要的问题。 为了理解这个问题,注意到两个或更多个明文块可能是相同的。 例如,两个或更多块中的明文可能是 HTTP/1.1"。 对于这些相同的块,块密码当然将产生相同的密文。 当攻击者看到相同的密文块时,它可能潜在地猜出其明文,并且通过识别相同的密文块和利用协议结构的知识,甚至能够解密整个报文。
为了解决这个问题,可以在密文中混合某些随机性,使得相同的明文块产生不同的密文块。 为了解释这个想法,令m(i) 表示第 i个明文块, c(i) 表示第 i个密文块,并且a⊕b表示两个比特串 a 和 b 的异或 (XOR)。 (两个比特串的异或是逐位进行的。 例如 10101010 ⊕ 11110000 = 01011010。)另外,将具有密钥S的块密码加密算法表示为Ks。 其基本思想如下:发送方为第i块生成一个随机的K 比特数r(i) , 并且计算c(i) =Ks(m(i)⊕r(i)) 。 注意到每块选择一个新的K比特随机数。 则发送方发送c(1) 、 r(1) 、 c(2) 、 r(2) 、 c(3) 和 r(3) 等等。 因为接收方接收到c(i) 和 r(i) , 它能够通过计算 m(i) =Ks(c(i)⊕r(i)) 而恢复每个明文块。 重要的是注意到下列事实: 尽管r(i) 是以明文发送的,并且因此能被嗅探到,但她无法获得明文m(i), 因为她不知道密钥Ks。 同时注意到如果两个明文块rn(i)和 m(j) 是相同的,对应的密文块c(i) 和c(j) 将是不同的(只要随机数r(i) 和r(i)不同,这种情况出现的概率将很高)
精明的读者将注意到,引入随机性解决了一个问题而产生了另一个问题: Alice 必须传输以前两倍的比特。 实际上,对每个加密比特,她现在必须再发送一个随机比特.使需要的带宽加倍。 为了有效利用该技术,块密码通常使用了一种称为密码块链接(Cipher Block Chaining, CBC) 的技术。 其基本思想是仅随第一个报文发送一个随机值然后让发送方和接收方使用计算的编码块代替后继的随机数。 具体而言, CBC运行过程如下:
1 ) 在加密报文(或数据流)之前,发送方生成一个随机的K 比特串,称为初始向量(Initialization Vector, IV) 。 将该初始向量表示为 c(0) 发送方以明文方式将 IV 发送给接收方。
2 ) 对第一个块,发送方计算m(1)⊕c(0), 即计算第一块明文与 IV 的异或。然后 对异或得到的结果 通过块密码算法 得到对应的密文块,即c(1) = Ks(m(1)⊕c(0)), 发送方向接收方发送加密块c(1)。
3 ) 对于第i个明文块,发送方根据c(i) = Ks(m(i)⊕c(i-1)) 生成第 i 个密文块。
我们现在来考察使用这种方法后发生的事。 首先,接收方将仍能够恢复初始报文。 毫无疑问, 当接收方接收到c(i) 时,它使用Ks解密得到s(i) =m(i)⊕c(i-1) ; 因为接收方已经知道c(i-1), 则进行 m(i) =s(i)⊕c(i-1) 计算获得明文块。 第二,即使两个明文块是相同的, 相应的密文块也(几乎)总是不同的。 第三,虽然发送方以明文发送 IV, 入侵者将仍不能解密密文块, 因为该入侵者不知道秘密密钥S。 最后,发送方仅发送一个最前面的块(即IV), 因此对(由数百块组成的)长报文而言增加的带宽用量微不足道。
公开密钥加密
从凯撒密码时代直到20世纪70年代的两于多年以来,加密通信都需要通信双方共享一个共同秘密, 即用于加密和解密的对称密钥。 这种方法的一个困难是两方必须就共享密钥达成一致, 但是这样做的前提是需要通信(可假定是安全的)!可能是双方首先会面,人为协商确定密钥, 此后才能进行加密通信。但是,在网络世界中,通信各方之间可能从未见过面, 也不会在网络以外的任何地方交谈。此时通信双方够在没有预先商定的共享密钥的条件下进行加密通信吗? 1976 年,Diffie 和 Hellman论证了一个解决这个问题的算法(现在称为 Diffie-Hellman
密钥交换) ,这是个完全不同、极为优雅的安全通信算法,开创了如今的公开密钥密码系统的发展之路。 我们很快就会看到公开密钥密码系统也有许多很好的特性,使得它不仅可以用于加密,还可以用于鉴别和数字签名。
公开密钥密码的使用在概念上相当简单。 假设 Alice要和 Bob 通信。 如下图所示,这时Alice 和 Bob 并未共享一个密钥(如同在对称密钥系统情况下) ,而Bob (Alice 报文的接收方)则有两个密钥,一个是世界上任何人(包括入侵者) 都可得到的公钥(public key) , 另一个是只有 Bob 知道的私钥 (private key) 。 我们使用符号Kb+和Kb-来分别表示Bob 的公钥和私钥。 为了与 Bob 通信, Alice 首先取得 Bob 的公钥,然后用这个公钥和一个众所周知的(已标准化的)加密算法,加密她要传递给Bob的报文m; 即Alice 计算 KB+(m) 。 Bob 接收到 Alice 的加密报文后,用其私钥和一个众所周知的(已标准化的)解密算法解密Alice 的加密报文,即 Bob计算 KB-(KB+(m))。 后面我们将看到,存在着可以选择公钥和私钥的加密/解密算法和技术,使得KB-KB+(m)) = m; 也就是说,用 Bob 的公钥加密报文 , 然后再用 Bob 的私钥解密报文的密文形式,就能得到最初的明文。 这是个不寻常的结果!用这种办法, Alice 可以使用 Bob 公开可用的密钥给 Bob 发送机密信息,而他们任一方都无须分发任何密钥!我们很快能够看到,公钥和私钥加密相互交换同样能够得到不寻常的结果,
即 KB+(KB- (m)) = KB- (KB+ (m)) = m

因此公开密钥密码体制的使用在概念上是简单的。 但是有两点必须要注意。 首先应关注的是,尽管入侵者截取到 Alice 的加密报文时看到的只是乱码,但是入侵者知道公钥(显然 Bob 的公钥是全世界都可以使用的)和 Alice加密所用的算法。 Trudy 可以据此发起选择明文攻击,使用已知的标准加密算法和Bob 的公开可用的加密密钥对她所选择的任意报文编码!例如, Trudy 可以尝试 怀疑 Alice 可能发送的全部报文或部分报文编码。 很明显,要使公开密钥密码能工作,密钥选择和加密/解密算法必须保证任意入侵者都不能(至少要困难得几乎不可能)确定出 Bob 的私钥或者以某种方式解密或猜出 Alice发给 Bob的报文。 第二个值得关注的问题是,既然 Bob 的加密密钥是公开的,任何人(包括 Alice和其他声称自己是Alice 的人)都可能向 Bob 发送一个已加密的报文。在对称密钥情况下,发送方知道共享秘密密钥的事实就已经向接收方隐含地证实了发送方的身份。 然而在公钥体制中,这点就行不通了,因为任何一个人都可向 Bob发送,使用 Bob 的公开可用密
钥加密的报文。 这就需要用数字签名把发送方和报文绑定起来
- RSA
尽管有许多算法处理这些关注的问题,但 RSA算法 (RSA algorithm, 取算法创立人Ron Rivest、 Adi Shamir 和 Leonard Adleman 的首字母命名)几乎已经成了公开密钥密码的代名词。 我们首先来理解RSA是如何工作的,然后再考察RSA 的工作原理。
RSA 广泛地使用了模n算术的算术运算。 故我们简要地回顾一下模算术。 前面讲过x mod n 只是表示x 被 n 除时的余数; 因此如 19 mod 5 = 4。 在模算术中,人们执行通常的加法、乘法和指数运算。 然而,每个运算的结果由整数余数代替,该余数是被n除后留下的数。 对于模算术的加法和乘法可由下列便于施用的事实所简化:

从第三个事实推出

我们很快将会发现这个恒等式是非常有用的。
现在假设Alice 要向 Bob 发送一个RSA加密的报文。 在我们的讨论中,心中永远要记住一个报文只不过是一种比特模式,并且所有比特模式能唯一地被一个整数表示。 例如,假设一个报文是比特模式1001; 这个报文能由十进制整数9来表示。 所以,当用RSA加密一个报文时,等价于加密表示该报文的这个唯一的整数。(意思是RSA对1001加密,等同于对十进制的 9加密)
RSA 有两个互相关联的部分:
- 公钥和私钥的选择。
- 加密和解密算法。
为了生成RSA 的公钥和私钥, Bob执行如下步骤:
- 选择两个大素数p 和 q。 那么p 和q 应该多大呢?该值越大,破解 RSA越困难,而执行加密和解密所用的时间也越长。 RSA实验室推荐,公司使用时, p 和 q 的乘积为1024 比特的数量级。
- 计算n=pq 和 z= (p -1) (q - 1) 。
- 选择小于 n 的一个数e, 且使e和z没有(非1的)公因数。 (这时称e与z互素。)使用字母e表示是因为这个值将被用于加密。
- 求一个数 d, 使得 ed- 1 可以被z整除(就是说,没有余数)。 使用字母d表示是因为这个值将用于解密。 换句话说,给定e, 我们选择d, 使得 ed mod z = 1
- Bob 使外界可用的公钥KB+ 是一对数 (n, e), 其私钥KB- 是一对数 (n, d)
Alice 执行的加密和 Bob 进行的解密过程如下;
- 假设Alice 要给 Bob 发送一个由整数m表示的比特组合,且m<n。 为了进行编码Alice 执行指数运算 m e ,然后计算 m e 被 n 除的整数余数 m^e,然后计算m^e被 n除的整数余数 me,然后计算me被n除的整数余数换言之, Alice 的明文报文m的加密值c就是:
c = m e m o d n c = m^e mod n c=memodn
对应于这个密文c 的比特模式发送给Bob。
为了对收到的密文报文c解密, Bob计算:
m = c d m o d n m = c^d mod n m=cdmodn
这要求使用他的私钥 (n, d)
- 会话密钥
这里我们注意到, RSA 所要求的指数运算是相当耗费时间的过程。 形成对比的是DES ,用软件实现要比 RSA 快 100 倍,用硬件实现则要快 1000 ~ 10000 倍 。 所以,在实际应用中, RSA 通常与对称密钥密码结合起来使用。 例如,如果Alice要向 Bob 发送大量的加密数据,她可以用下述方式来做。 首先, Alice选择一个用于加密数据本身的密钥,这个密钥有时称为会话密钥 (session key) , 表示为 Ks。这个会话密钥一般是临时随即生成的,当Alice和Bob要通信的时候生成。
Alice 必须把这个会话密钥告知 Bob, 因为这是他们在对称密钥密码中所使用的共享对称密钥。 Alice 可以使用 Bob 的 RSA公钥来加密该会话密钥,即计算 c=(Ks)^e mod n。 Bob 收到了该RSA 加密的会话密钥 c 后,解密得到会话密钥Ks。 Bob此时已经知道Alice 将要用于加密数据传输的会话密钥了。随后双方开始通信,这个时候双方给报文使用的是对称密钥方式,加密解密使用的是会话密钥Ks。而不使用公开密钥进行加密解密来通信。
- RSA 的工作原理(不作介绍)
RSA 加密/解密看起来相当神奇, 为什么那样应用加密算法,然后再运行解密算法就能恢复出初始报文呢?
RSA 的安全性依赖于这样的事实:目前没有已知的算法可以快速进行一个数的因数分解,这种情况下公开值n无法快速分解成素数p和q,如果已知p 和q, 则给定公开值e,就很容易计算出秘密密钥d。
参考目录
书籍:《计算机网络:自顶向下方法(第七版)》