行业新闻与博客

块密码与流密码:它们是什么以及它们如何工作?

对称加密密码包括两大类:块密码和流密码。我们将定义和分解每个过程,并提供块密码和流密码示例,让您更深入地了解确保数据安全的技术

了解块密码与流密码之间的区别有点像在 DVD 上观看电影或通过流媒体服务观看电影之间的区别。当然,两者都会为您提供您所寻求的娱乐,但它们在机制和速度方面的工作方式各不相同。

今天,我们将介绍这两组对称密钥密码。但是流密码与块密码之间有什么区别?每个保护伞下都有哪些类型的密码?哪些用于 SSL/TLS 加密连接?分组密码和流密码如何保护您的数据以及您何时使用它们?

让我们讨论一下。

编者按:本文是对称加密系列文章的第一篇。请务必查看以下相关文章:

  • 对称加密 101:定义、工作原理和使用时间
  • 对称加密算法:Live Long & Encrypt
  • 非对称与对称加密:定义和差异

块密码与流密码

块密码和流密码是加密数据的两种方式。也称为批量密码,它们是对称加密算法的两类。(提醒:使用对称加密,您使用相同的密钥来加密和解密数据。)块密码和流密码是实现保护数据的相同最终目标的两条不同的途径。两者之间的最大区别在于数据的加密方式——每种方法各有利弊——以及它们运行的环境类型。

现在,让我们分解一下这些密码的一般含义以及它们的工作原理。

块密码和流密码是使用对称加密算法加密数据的两种不同方法:

  • 以块的形式加密信息。块密码将明文消息分解为固定大小的块,然后使用密钥将它们转换为密文。
  • 逐位加密信息。另一方面,流密码将明文消息分解为单个位,然后使用密钥位将其单独转换为密文。

(注意:有些人说流密码按单个位加密数据,其他人说按字节 [8 位]。因此,为了方便起见,在本文中我将坚持说单个位。)

如果您想通过一个简单的类比来更好地理解块密码与流密码,请想象您正在加密一本书。您可以一次加密一页内容(块密码)或一次加密一个字母(流密码)。

当然,这两个过程都比这更复杂,但这让您对它们是什么以及它们的作用有一个基本的了解。根据 Jean-Philippe Aumasson 在他的书“Serious Cryptography: A Practical Introduction to Modern Encryption”中所说:

“[…] 块密码将明文位块与密钥位混合在一起,以生成相同大小的密文块,通常为 64 或 128 位。另一方面,流密码不会混合明文和密钥位;相反,他们从密钥中生成伪随机位,并通过与伪随机位进行异或运算来加密明文 [.]”

如果那一清二楚,那就不用担心了。稍后我们将更深入地探讨事物的本质技术方面。但首先,您会在哪里找到正在使用的这些类型的密码?看看你周围的技术。

块密码是构成当今计算机通信中使用的许多加密技术和过程的支柱的算法。基本上,您几乎可以在网络安全领域的任何地方找到分组密码。

在流密码方面,它们没有得到很好的研究。但是,您会发现流密码用于:

  • SSL/TLS 连接
  • 蓝牙连接
  • 蜂窝和 4G 连接

密码学中的 XOR 运算

这是讨论块密码和流密码时要涵盖的一个重要概念,但没有什么好地方可以将其放入文章中,因此我们将在此处进行。好的,您在阅读有关密码学的文章时可能已经看到了这个看起来很奇怪的小符号:⊕。这称为 XOR,或代表“异或”逻辑运算。

流密码对二进制数据使用按位 XOR 运算符作为其加密和解密过程的一部分。您还记得 Aumasson 提到的伪随机位吗?基本上,当您谈论流密码时,这被称为密钥流。并且密钥流必须是不可预测的才能安全。

因此,XOR 所做的是比较两个输入位并生成一个输出位。这是一种检查错误的方法。如果两个位都匹配,则返回0(假);如果它们不匹配,则返回1(真)。

这是一个供参考的快速表(这称为 XOR 表):

输入位 1输入 Bit2输出
000
01 个1 个
1 个01 个
1 个1 个0

基本上,Bit1 ⊕ Bit2 = 输出

所以,假设 Bit1 是101000101而 Bit2 是100101110。下面是对两组二进制位进行异或运算时的样子:

101000101 ⊕ 100101110 = 001101011

这意味着您的输出将是001101011。很酷吧?

好吧,那实际上并没有那么糟糕,是吗?现在我们已经解决了这个问题……让我们开始讨论什么是流密码和分组密码。为此,我们将对每一个进行定义和分解,以便您更好地理解它们是什么并了解它们的不同之处。

什么是分组密码?

顾名思义,块密码是一种允许您使用密钥对预定大小(例如 128 位、256 位等)的大组(块)中的数据进行加密的密码。因此,这样做的目的是允许您将块中的所有数据作为一个单元进行加密。例如,假设您收到消息:“为了联盟。” (不要恨,部落的粉丝们。你们的时代会到来的。)

如果您想使用块密码对其进行加密,则明文消息将被分解为更小的二进制块。所以,“为了联盟”看起来像这样:

01000110011011110111001000100000011101000110100001100101001000000100000101101100011011000110100101100001011011100110001101010100

现在,如果我们将这 136 个二进制数字分成块,比如 4 个数字,它会很好地划分,因为 4 进入 136 总共 32 次。这些块看起来像这样:

块密码与流密码图:此图说明了一条消息被分成数据块。

但是,如果没有足够的数据来形成一个完整的块,你会怎么做?比方说,如果您有 138 个二进制数字而不是 136 个(意味着您的最后一个数据块不完整)?然后你可以做的是在块的末尾添加填充(这可能是一组 0)以确保块是固定大小。

块密码与流密码图:概述使用块密码的加密过程的基本图
展示分组密码如何工作的基本图表。

分组密码示例:分组密码的这个简化版本说明了分组密码的整体工作原理。它在设计上类似于 ECB 运作模式的运作方式,稍后您将在本文中了解更多信息。

根据您使用的操作模式(我们将在稍后解释),然后将块“链接”在一起,从而使块能够按顺序连接。在某些情况下,块密码可以根据其操作模式作为流密码操作。这是因为它们由于这些模式而具有某些属性,我们将在本文后面讨论。  

分组密码示例图,显示基本分组密码链接操作的工作原理

使用链接操作的基本分组密码(用橙色连接箭头表示)。在这种情况下,这类似于 CBC 分组密码操作模式的简化示例。是的,我知道,这个插图缺少初始化向量和 XORing。但是,这应该是一个简化版本,只是为了展示一个数据块到下一个数据块的链接。

但是使用块加密算法有什么优势呢?

  • 就插入符号而言,分组密码很难搞砸。
  • 密码学家对它们进行了高度分析和研究,这意味着比你我更聪明的人曾试图破解它们。

那么,一些常见分组密码的例子有哪些?

分组密码的例子

  • 数据加密标准(DES),
  • 三重 DES(3DES 或 TDEA),
  • 高级加密标准(AES),
  • 国际数据加密算法(IDEA),
  • 河豚,
  • 双鱼
  • RC5

如果 AES 听起来很熟悉,那是有充分理由的。它实际上是最常用的分组密码类型。您会发现 AES 加密用于从保护 SSL/TLS 互联网连接到政府数据的一切事物。例如,国家安全局 (NSA) 依靠 AES 加密来保护其被归类为最高机密的数据。  

什么是流密码?

流密码是一种随流(即数据流)加密(和解密)的密码。与需要在加密之前形成块的分组密码不同,流密码以长的、伪随机流的形式加密数据。基本上,这意味着您可以一次处理一位数据,而不是等待数据块形成。

Ayesha Khalid、Goutam Paul 和 Anupam Chattopadhyay 在他们的《加密工作负载的领域特定高级综合》一书中将流密码描述为有限状态机或 FSM 和状态密码。第一次描述(FSM)的原因是因为这些密码一个一个地接收明文数据位,并以相同的方式吐出密文符号。它们也被称为有状态密码的原因是因为它们依赖于它们的密钥流函数的内部状态。

但是您知道实际上有两种类型的流密码吗?

  1. 同步流密码(又名密钥自动密钥,或 KAK) ——这些类型的密码独立于任何先前的明文或密文生成密钥流。
  2. 自同步流密码 (又名异步流密码、密文自动密钥或 CTAK) ——另一方面,这些密码依赖于先前的密文位来生成密钥流。

流密码的工作原理

那么,从更技术的角度来看,流密码实际上是如何工作的呢?如前所述,流密码一次一位而不是块地加密数据。但是这个过程的一个关键部分是根据加密密钥和种子生成伪随机比特流,也称为随机数(随机生成的唯一数字——“随机数”= number-only-used-once)。它们一起创建一个密钥流(我们刚才提到的伪随机位流),该密钥流与您的明文输入进行异或运算,对其进行加密并生成密文输出。

这种冲洗和重复过程对每一位明文数据一遍又一遍地发生。但是,重要的是不要再次使用完全相同的 key-nonce 组合,因为它会导致重复的密钥流。

感觉有点迷茫?这是提供一点清晰度的过程的可视化:

块密码与流密码图:概述使用流密码的加密过程的基本图
流密码示例:这是展示流密码基本操作的基本图示。

为了更好地理解这一点,让我们来看一个例子。让我们考虑一个替代我们之前使用的例子的短语:“为了部落!” (看到了吗?我没有忘记你们。)此明文消息的二进制版本如下所示:

01000110011011110111001000100000011101000110100001100101001000000100100001101111101110010011001000110010100100001

因此,如果我们使用流密码来加密消息,我们将一次加密一位。因此,明文数据将被分解成单独的位,看起来像这样:

块密码与流密码图形:此图说明了一条消息被分成单独的位以进行加密。

是的,读完那个,呃,彩色图片后,花点时间让你的眼睛适应一下。

因此,下一步是生成伪随机位序列(即密钥流)。这通常基于内部状态。

获得密钥流后,您可以将伪随机位与明文消息的二进制文件进行异或运算。回想之前的 XOR 表,这意味着如果明文消息的第一位是1并且密钥流的第一位是0,那么输出将是1。如果明文消息的第二位是另一个1并且密钥流的第一位也是1,那么输出也将是0。得到它?是的,这基本上就是流密码的工作原理。   

流算法比块密码更快、更有效,因为它们一次只将一位数据加密为单个符号而不是整个块。因此,它们更适合资源较少的设备。此外,作为这种单比特数据方法的结果,这意味着如果一个符号中存在错误,则不太可能影响下一个符号。然而,一些流密码容易受到位翻转攻击和密钥重用攻击。

流密码的一个非常基本的例子是凯撒密码,它是一种将一个字符单独替换为另一个字符的密码。但这是一个非常古老和过时的密码示例。那么,我们今天可以找到哪些类型的流密码?

流密码示例

  • Salsa20(软硬件实现)
  • ChaCha20(Salsa20 的修改版本;ChaCha20 在 TLS 1.3 中得到支持),
  • RC4(用于无线网络),以及
  • A5(用于 GSM 蜂窝网络)。

但是请记住,这个流密码列表绝不是全面的。但它至少为您提供了几个对称加密算法的示例,您可以将它们与每个算法相关联。

块密码或流密码更安全吗?

这个问题的答案并不像声明“分组密码比流密码更安全”或反之亦然那么简单。我的意思是,真正决定块密码或流密码安全性的是密钥的强度。但是,如果您只是对密码的内部运作保密,那会怎样呢?这会让它更安全,对吧?嗯,没那么多。

Bruce Schneier 说得好:

“任何人,从最笨拙的业余爱好者到最优秀的密码学家,都可以创建他自己无法破解的算法。这甚至都不难。困难的是创建一种其他人无法破解的算法,即使经过多年的分析。证明这一点的唯一方法是让周围最好的密码学家对算法进行多年的分析。”

这就是为什么最受信任的密码是那些算法被全世界的密码学家发布、分析和测试的密码。想想 AES,或者最初被称为 Rijndael(以其创建者 Joan Daemen 和 Vincent Rijmen 命名)的东西。

分组密码操作模式

还记得我们提到过一些块密码可以作为流密码运行吗?这可以通过特定的操作模式实现,包括 CFB、OFB 和 CTR——我们将在稍后讨论所有这些。但是,请务必注意,流密码不能转换为分组密码或作为分组密码运行。这有点像毛毛虫如何变成蝴蝶,但反之则不然。 

出于本文的目的,我们将重点关注保密操作模式。您知道 NIST 推荐的分组密码有五种保密模式吗?您可以在 NIST SP 800-38A:块密码操作模式建议 中找到它们。

让我们简要介绍五种模式中的每一种,以更好地理解每种模式是什么以及它是如何工作的:

1.电子密码本(ECB)模式

这是单独加密块的最简单(也是最弱)的操作模式。它不是为依赖于先前块的输出的新块而设计的。这意味着您可以独立地加密或解密数据块。

来自 NIST 的 ECB 块密码操作模式的屏幕截图。 这是分解加密和解密过程的图表。
NIST SP 800-38A 中的 ECB 模式加密和解密过程的屏幕截图:操作方法和技术的分组密码模式建议。

它也是最容易被坏人挑出来的,因为所有数据块都以相同的方式加密,这使得检测模式变得容易。所以,如果你最终发送了不同的消息,但有些消息是相同的,那么你最终会得到一些相同的密文实例。想想著名的 ECB 模式 Linux 企鹅示例。这里的想法是,即使您无法解密某些位(例如 Linux 企鹅徽标的像素),您仍然可以从可以解密的模式中分辨出足够多的内容,从而仍然理解整个消息。

基本上,ECB 往往会泄露有关您尝试加密的消息的过多信息。因此,这里的重点是不要依赖欧洲央行进行安全加密。

2.密码块链接(CBC)模式

这种操作模式的要点是它是一个建立在先前数据块之上的顺序过程(这是我们前面提到的显式链接)。因此,使用初始化向量 (IV),输入数据的明文块“链接”到之前的密文输出块。为了使 IV 更加随机,在对每个输入进行加密之前对其进行异或运算。

在数据通过密码后,输出将链接到随后的后续数据块。这种数据链接过程称为显式链接,有助于进一步掩盖您的信息。它通过添加来自前一个块的数据来做到这一点。因此,即使您发送或接收两条完全相同的明文消息,由于链式数据,每条消息的密文也会不同。

来自 NIST 的块密码 CBC 操作模式的屏幕截图。 这是分解加密和解密过程的图表。
来自 NIST SP 800-38A 的 CBC 模式加密和解密过程的屏幕截图:操作方法和技术的分组密码模式建议。顶部从左到右显示了如何将三个单独的消息链接在一起并进行加密。底部从左到右显示了如何解密这些单独的消息。

因此,基本上,CBC 模式采用 ECB 模式,并通过添加以前区块的数据,在复杂性和机密性方面提高了一个档次。但是,它不再经常使用了。为什么?几个重要的原因:

  1. 这种操作方式很慢。您不能同时加密或解密两条或多条消息,因为每条消息都包含来自前一个块的数据。虽然这对于小文件来说可能不是问题,但对于大规模加密或解密来说却是一个巨大的挑战。
  2. 这种操作模式容易受到填充攻击和操纵。如果攻击者设法改变一个块的密文,由于数据链,下一个块将受到影响。

显式链接涉及 CFB 和 OFB 模式。作为 CBC、CFB 和 OFB 模式的加密和解密步骤的一部分,IV 的使用对于这三种模式的安全性是不可或缺的。

注意:NIST 确实发布了关于 CBC 模式的附录 ( NIST SP 800-38A-Addendum )。本文档指定了避免密文扩展的 CBC 模式的三种变体。

3.密码反馈(CFB)模式

此操作模式生成伪随机位。它使用来自链中前一个块的密文(这称为反馈,因此是合适的名称)和加密密钥来执行此操作。

需要注意的重要一点是,在加密和解密过程中都使用了加密密码函数,而不是先使用加密函数再使用解密函数。此外,错误传播是 CFB 模式的一个问题,因为一个块中的错误可以转移到下一个块中(尽管它不会影响超出该块的块)。但是,这不是 OFB 或 CTR 模式的问题,我们将在接下来进行介绍。

来自 NIST 的块密码 CFB 操作模式的屏幕截图。 这是分解加密和解密过程的图表。
NIST SP 800-38A 中的 CFB 模式加密和解密过程的屏幕截图:操作方法和技术的分组密码模式建议。

4.输出反馈(OFB)模式

这种模式的想法是它类似于 CFB,但是,随机数的生成依赖于前一个块输出的密码函数作为反馈。OFB 加密和解密也都使用了加密函数。然而,OFB 没有做的是将明文或密文作为密码函数处理的一部分。

NIST 分解了从一个块到下一个块的过程:

“在 OFB 加密中,IV 由正向密码函数转换以产生第一个输出块。第一个输出块与第一个明文块进行异或运算,生成第一个密文块。然后在第一个输出块上调用前向密码函数以生成第二个输出块。第二个输出块与第二个明文块进行异或运算,生成第二个密文块,并在第二个输出块上调用正向密码函数,生成第三个输出块。”

… 等等等等。基本上,每个块的输出都是通过将密码应用于前一个块的输出而产生的。通过将输出与明文进行异或运算,您将获得下一个密文块。

该过程如下所示:

来自 NIST 的 OFB 分组密码操作模式的屏幕截图。 这是分解加密和解密过程的图表。
来自 NIST SP 800-38A 的 OFB 模式加密和解密过程的屏幕截图:操作方法和技术的分组密码模式建议。

但是当你到达最后一个块输出时会发生什么?有的用于最后的异或运算;其他人被丢弃。

5.计数器(CTR)模式

好吧,你们再坚持一会儿。我们在最后一个!这种操作模式是 NIST 推荐的最新模式,旨在用作伪随机生成的计数器(因此得名)。这是最常用的操作模式之一。

CTR 模式与 OFB 模式有相似之处,但仍有不同。例如,与以前的操作模式不同,CTR 不需要显式链接并且是可并行的。这意味着您可以并行处理和加密单独的消息(如流密码)。所以,这意味着因为它不依赖于前一个块的输出,所以你可以独立地解密两个块。 

此模式的安全性取决于计数器值 (CV) 的保护,因此您永远不应该回收您的 CV。

来自 NIST 的块密码 CTR 操作模式的屏幕截图。 这是分解加密和解密过程的图表。
来自 NIST SP 800-38A 的 CTR 模式加密和解密过程的屏幕截图:操作方法和技术的分组密码模式建议。

是的,我知道,以上所有模式看起来就像一碗字母汤,里面全是首字母缩略词——ECB、CFB、OFB 等。但是这些模式的作用(当与 FIPS 批准的分组密码算法配对时)很重要,因为没有其中之一,分组密码就无法运行。这些操作模式有助于保护敏感的非机密计算机数据。

如果操作模式让您兴奋,或者如果您非常喜欢惩罚,请务必查看 NIST 的出版物 (SP 800-38A),以便更深入地了解我们上面强调的五种操作模式中的每一种. (它深入探讨了所有让我们其他人感到有点不对劲的数学规范。)

您还可以熟悉其他操作模式,例如Galois Counter Mode (GCM)XEX Tweakable Block Cipher with Ciphertext Stealing (XTS)模式(包括用于 AES 模式的 XTS)。但我们不打算在这里讨论所有这些。

要了解这些操作模式如何与密码套件中的批量密码一起使用,请务必查看我们分解密码套件的文章。

TL;DR:块密码与流密码

是的,有很多信息需要仔细阅读。但是,我们希望本文能让您更清楚地了解流密码和分组密码、它们的作用以及它们的工作原理。

没有时间阅读所有这些技术内容来区分块密码和流密码?不用担心,我们已经为您提供了块密码和流密码的快速概述:

块密码流密码
加密和解密固定大小块中的数据的对称密钥密码。对称密钥密码是有状态的密码,可以逐位加密和解密数据。
处理速度较慢。更快的处理。
需要更多资源。需要更少的资源。
可以通过某些操作模式采用流密码属性。不能采用块密码属性。
依赖无状态和有状态的操作模式,包括 ECB、CBC、CFB、OFB、CTR、GCM 和 XTS。可以是同步的或异步的。
几乎无处不在。用于一些数据传输加密,包括一些 SSL/TLS 密码套件。

需要帮助吗?联系我们的支持团队 在线客服