科普 | 密码学极速入门,Part-2

科普 | 密码学极速入门,Part-1

(续前)

操作模式

一次性加密超过 128 位比特明文的方法(或者说操作模式)有许多种,其中最简单的就是电子密码本模式(Electronic Codebook),或者简称 ECB 。

ECB

ECB 是分组密码当中加密大数据量明文时最简单的操作模式。在 ECB 方法中,直接把明文消息分割成 16 比特的区块,然后用密钥分别加密这些小区块。为了保证每一个区块都有 16 比特,有时需要对明文进行拓充。举例来说,一则 28 比特的明文消息需要额外增加 4 个比特,以生成两个 16 比特大小的区块。当明文消息被分割成不同的小区块后,使用密钥对各区块分别进行加密操作。

-电子密码本模式的加密过程-

虽然电子密码本过程非常容易理解,但它的简单带来了突出的问题。正是因为间隔分明的明文区块会产生同样间隔分明的密文区块,因此很容易从中识别出特定的模式。举例来说,先看一下这张经过 ECB 加密模式处理过的点阵图。

可以看到在加密之后包含统一信息的区域依然没有改变,因此很容易识别出原始图像的大致模式。为了解决这一安全隐患,我们需要一种更安全的操作模式。

译者注:此处还需提醒的是,安全的加密算法,都必须是 “概率性的”,即对同一明文消息,每次加密产生的密文都应是不同的。这是为了保证在 “选择明文攻击(Chosen Plaintext Attack)” 下的安全性(CPA-secure)。确定性算法是无法实现 CPA-secure 的。

CBC

密码分组链接模式(Cipher Block Chaining,简称 CBC)的工作流程与 ECB 十分相似,但加入了一些改动。在每一个明文区块进行加密操作之前,它首先要和前一个区块的密文进行异或计算,从而保证每一个明文区块的独特性。至于第一个明文区块,则需要和一个随机生成的初始化向量进行异或计算。

-密码分组链接(CBC)模式的加密过程-

同样用上面那张点阵图作为图像加密的例子,可以很直观地看到加密结果的安全性大大提高。

本文介绍了两种主要的操作模式,如果对其它操作模式感兴趣,可以阅读 这篇文章

以上就是分组密码学入门的全部内容,下面我们来介绍本文中最后一个重要的密码学概念。

公钥密码

目前为止我们介绍的加密技术都属于 对称性加密Symmetric Encryption )的范畴,意味着在加密和解密数据的过程中只使用一个密钥。而对于公钥密码,或者说 非对称加密Asymmetric Encryption ),则使用由 “公钥”(Public Keys)和 “私钥”(Private Keys)组成的 密钥对 ,以支持在不可信信道中的加密通信。下文将详细解释这一过程。

公钥密码常用于服务器或者设备之间的加密通信,被广泛应用在邮件收发或是网页浏览中。不过为了行文方便,在下文中我们用 “Alice” 和 “Bob” 指代用户。

我们假设有两个用户:Alice 还有 Bob,他们相互收发消息。虽然这里只介绍了两位用户之间的消息交换,但这个例子可以套用到网页浏览、电子邮件收发以及其它安全消息交换的场景中。

在上图这个简单的场景下, Alice 和 Bob 可以自由通信。但是假如我们在会话中加入一个窃听者呢?这个窃听者能够窃取 Alice 和 Bob 之间收发的消息数据,但无法篡改数据。

-这个 “攻击者” 可能是在不安全 WiFi 网络环境下的其它用户、互联网提供商或者网络管理员-

在这个场景下,攻击者可以接触到用户收发的所有数据,但无法对数据进行篡改。因此加入了攻击者后, Alice 和 Bob 之间无法传递敏感或机密的消息。

看到这里,也许会想到上文中的 对称加密 ,但实际上对称加密并不能解决这一问题。

可以看到对称加密基本毫无效果,因为攻击者可以轻易窃听到通信所采用的密钥,然后用该密钥解密消息。Alice 和 Bob 其实应该采用公钥密码,下面我们就来深入探讨一下这个问题。

什么是公钥密码?

公钥密码要求每个用户都创建一对密钥:一个公钥以及一个私钥。公钥可以随意传播分发,而私钥则只能保管在密钥所有者手中。在公钥密码的通信系统中,任何人都能用收信人的公钥对消息进行加密,但只有手握私钥的收信人才能解密消息。

正是因为这样,当 Bob 想要向 Alice 发送一则加密消息时,它可以在发送前使用 Alice 的公钥对消息进行加密。Alice 在收到消息后再用她的私钥解密。(具体的技术细节稍后解释)

之所以转向非对称加密,有一点是因为用于解密消息的私钥永远不会暴露,更不会在通信信道中分发传播(译者注:即避免了对称密码机制必须面对的密钥交换问题)。如下图所示,非对称加密技术可以一定程度上解决前面提到的窃听者问题:

即使攻击者能窃听 Alice 和 Bob 之间的所有信息,由于缺少用于解密消息的私钥,他们也无法从中获取任何信息。

虽然非对称加密很大程度解决了窃听者问题,但这又引发了我们对另一个主要安全隐患的担忧。目前为止,我们的假设都限定攻击者仅能接收消息,而无法对数据进行篡改。但去掉这个限制,假设在我们的威胁模型中攻击者能够篡改传输的数据,那他们依然能成功实施 中间人攻击 。如果 Alice 和 Bob 在进行普通的邮件收发,那攻击者就可能伪装成邮局;如果二人进行计算机网络通信,攻击者则会充当互联网服务提供商,或者有办法访问网络通信所使用的设备。

在上图中,攻击者会扣下 Alice 的公钥,并把自己的公钥传递给 Bob。那当 Bob 想要向 Alice 发送加密信息时,实际用来加密的反而是攻击者的公钥。攻击者也因此能轻松读出本来发给 Alice 的消息,甚至能篡改消息后再发给 Alice 。

中间人攻击之所以可行,是因为目前系统存在两个重大缺陷。一是缺乏数据完备性(Integrity),即系统没有核验数据是否被篡改过的手段,二是不具备可靠性(Authenticity),即无法判定消息是由某个特定的用户发送而来的。这两个重大缺陷可以通过 数字签名数字证书认证机构 来修复。

数字签名

数字签名技术是用来保障消息不被篡改的一种手段,它同时可以确保数据是由正确的发信人生成的。正如上文提到那样,只有用某个人的私钥才能解出对应公钥加密过的消息,这个道理反过来也成立。利用某个人私钥加密过的消息同样只能用该用户的公钥进行解密,所以如果 Alice 向 Bob 发送一条由 Alice 私钥加密过的消息,Bob 就需要用 Alice 的公钥进行解密,也正因如此就保证了该消息至少是由某个有权限使用 Alice 私钥的人发出的。这个过程就是我们经常提到的 “签名”。(译者注:作者这里的措辞虽然是 “加密” 和 “解密”,但更合适的用词应该是 “签名” 和 “验签”;这个过程不像加密那样是为了达成 “机密性”,而是为了保证 “身份同一性”。)

虽然可以直接签名整条消息,但要是仅对消息的密码学哈希进行签名,无疑可以简化这一过程,从而大大提升效率。将签名过的消息哈希加到消息体内,就能确保数据自创建后没有被篡改过(译者注:即如果篡改了是能够验证出来的)。

(需要提醒大家,此处描述为重度缩减版。上面提到的 “用私钥进行加密” 和 RSA 算法十分接近,但在 Diffie-Hellman 或者 ECC 系统中,则使用了像 ECDSA 一类的签名算法,它跟 RSA 完全不同)

不过这只把我们的问题向前推进了一小步。Bob 虽然现在可以确定收到的消息被之前通信对象的私钥加密过,同时消息没有被篡改,但他依然不能确定前面收到的公钥真的属于 Alice 。为了解决这一问题,我们需要引入数字证书认证机构(Certificate Authorities)。

数字证书认证机构

数字正式认证机构是一个发起数字签名并发布某一用户或实体对应公钥的受信任第三方。

上图证书使用了数字认证机构的私钥完成签名,因此所有用户都能验证由该数字认证机构签发的证书。因此对另一个用户的信任问题转移到了 CA 密钥的有效性上。

在实际工程中,数字证书最广泛的应用场景是保障安全的网站流量。当用户访问一个使用了 HTTPS 的网站时,可以在浏览器上查看它的数字证书。

这个系统需要信任由数字认证机构签发的数字证书,因此计算机等设备会预置一个可信清单,记录可信的数字认证机构以及它们的公钥。

-Windows 10 系统中部分预置的根 CA-

对于一篇入门科普文,本文的篇幅已经足够长了,因此我不会再细致地介绍公钥密码系统的具体流程和技术细节。对这方面感兴趣的读者,可以阅读这篇讲述 RSA 这个同时完成了保密和签名系统的内在原理的文章。

流/分组密码和公钥密码的一个显著差异在于,流/分组密码对单个的比特或字节进行操作,而公钥密码需要对数字进行处理。这就意味在公钥密码中,消息在进行加密前需要先转换为数字。也正因如此,在面对一些数据量大的消息时,公钥密码并不够高效。为了弥补这一缺陷,我们可以将对称加密和非对称加密结合,以提高利用收信人公钥进行大量数据加密时的效率。

PGP 就使用了这样的一种方法。首先使用随机生成的密钥对消息进行分组加密,然后使用收信者的公钥对数据量相对较小的密钥进行加密。这样以来,密文消息就被关联到了随机生成的密钥上。

由于分组密码可以快速加密大量数据,同时采用非对称密码加密数据量相对小的密钥,因此可以在保证安全的前提下大大提高系统的效率。这种做法完全适用公钥密码系统,因为只有掌握私钥的收信人才能解出用于解密消息的密钥。

接下来学啥呢?

非常感谢你能坚持阅读到这里,干货到此为止。现在你已经对流密码、分组密码以及公钥密码有了足够的了解,在赞叹密码学今天的发展成果之余也有基础开启新的学习道路。

对于想进一步深入的读者,我强烈推荐学习斯坦福的在线课程 Cryptography I Course ,它很好讲述了密码学中的技术和理论概览。另一个不得不提的资源是这本 Crypto 101 ,它介绍了密码学中在多个领域的灵活运用,以及如何发现密码系统的常见漏洞。对于有兴趣在真实世界中利用编程手段实践密码攻防的读者,我强烈推荐 Cryptopals 挑战

(完)

原文链接: https://medium.com/dataseries/a-crash-course-in-everything-cryptographic-50daa0fda482

作者:Leo Whitehead

翻译&校对:安仔Clint & 阿剑