行业新闻与博客

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

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

了解分组密码与流密码之间的区别就像是在 DVD 上观看电影或通过流媒体服务观看之间的区别。当然,两者都可以为您提供您想要的娱乐体验,但是它们在工作原理和速度方面都各不相同。

今天,我们将讨论这两组对称密钥密码。但是,流密码与分组密码之间有什么区别?每个保护伞都包含哪些类型的密码?SSL / TLS 加密连接中使用了哪些?分组密码和流密码如何工作以保护数据安全?何时使用每个密码?

让我们将其散列出来。

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

  • 对称加密 101:定义,工作原理和使用时间
  • 对称加密算法:长期有效和加密
  • 非对称与对称加密:定义和差异

分组密码与流密码

分组密码和流密码是加密数据的两种方法。也称为批量密码,它们是两类对称加密算法。(注意:使用对称加密时,您使用相同的密钥来加密和解密数据。)分组密码和流密码是到达同一最终目标以保护数据的两条单独途径。两者之间最大的区别是如何得到的数据进行加密-有优点和缺点每种方法-和类型它们经营环境。

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

分组密码和流密码是使用对称加密算法加密数据的两种独立方法:

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

(注意:有些人说流密码按单个位加密数据,另一些人按字节 [8 位] 加密。因此,在本文中,为了简化起见,我只坚持说单个位。)

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

当然,这两个过程都比这更复杂,但这使您对它们是什么以及它们的工作有一个基本的了解。让-菲利普·奥马森(Jean-Philippe Aumasson)在他的《严重的密码学:现代加密实用入门》一书中说

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

如果那像泥一样清楚,那就不用担心。不久我们将深入研究技术的本质。但是首先,您在哪里可以找到使用这些类型的密码?环顾四周,便拥有无与伦比的技术。

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

在涉及流密码的地方,还没有对其进行充分研究。但是,您会发现流密码在以下方面使用:

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

密码学中的 XOR 运算

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

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

因此,异或运算是比较两个输入位并生成一个输出位。这是检查错误等的一种方法。如果两个位都匹配,则返回0(假);否则返回0。如果它们不匹配,则返回1(true)。

这是快速参考表(称为 XOR 表):

输入 Bit1输入 Bit2输出量
000
01 个1 个
1 个01 个
1 个1 个0

基本上,1⊕位 2 =输出

因此,假设 Bit1 为101000101和 Bit2 为100101110。对两组二进制位进行 XOR 运算后,结果如下所示:

101000101 ⊕ 100101110 = 001101011

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

好吧,那实际上还不错,不是吗?现在我们已经解决了这个问题……让我们深入研究什么是流密码还是分组密码。为此,我们将定义并分解每个分类,以便您可以更好地了解它们是什么,并了解它们的不同之处。

什么是分组密码?

顾名思义,分组密码就是一种允许您使用密钥对预定大小(例如 128 位,256 位等)的大组(块)中的数据进行加密的密码。因此,这样做是允许您将一个块中的所有数据加密为一个单元。例如,假设您收到以下消息:“ For the Alliance”。(别恨,部落粉丝。您的时机到了。)

如果要使用分组密码进行加密,则纯文本消息将分解为较小的二进制块。因此,“ For the Alliance”将如下所示:

0100011001101111011100100010000001110100011010000110010100100000010000010110110001101100011010010110000101101110011000110110010100101110

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

分组密码与流密码图形:此图像说明了将消息分为数据块。

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

分组密码与流密码图形:基本图,概述了使用分组密码的加密过程
一个基本图,展示了分组密码的工作方式。

分组密码示例:分组密码的简化版本说明了分组密码的整体工作方式。它的设计与 ECB 操作模式的工作原理类似,您将在本文的后面部分了解更多信息。

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

块密码示例图,显示了基本块密码链接操作的工作方式

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

但是使用块加密算法的优点是什么?

  • 就插入符号而言,分组密码很难弄乱。
  • 密码学家对它们进行了高度分析和研究,这意味着比您和我聪明的人都试图打破它们。

那么,一些常见的分组密码的例子是什么?

分组密码的例子

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

如果 AES 听起来很熟悉,则有充分的理由。实际上,这是最常用的分组密码类型。从安全的 SSL / TLS 互联网连接到政府数据,您会发现 AES 加密在所有方面都得到了使用。例如,国家安全局(NSA)依靠 AES 加密来保护其数据,这些数据被归类为最高机密。  

因为分组密码是最常用和研究最多的密码,所以它们是本文的主要重点。但是,让我们花一些时间来探索流密码,以帮助您熟悉它们的本质,它们如何工作以及它们与分组密码的区别。

什么是流密码?

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

Ayesha Khalid,Goutam Paul 和 Anupam Chattopadhyay 在他们的书“用于加密工作负载的特定于域的高级综合”中将流密码描述为有限状态机或 FSM 和有状态密码。进行第一个描述(FSM)的原因是因为这些密码一个接一个地接收数据的明文位,并以相同的方式吐出密文符号。之所以将它们称为有状态密码,是因为它们依赖内部状态来实现密钥流功能。

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

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

流密码如何工作

那么,流密码实际上是如何在技术上起作用的呢?如前所述,流密码一次加密一位数据,而不是逐块加密。但是,此过程的关键部分是根据加密密钥和种子(也称为随机数)(唯一的随机生成的数字-“ nonce” =仅使用一次的数字)生成伪随机比特流。它们一起创建了一个密钥流(我们刚才提到的伪随机比特流),该密钥流与您的纯文本输入进行异或运算,然后对其加密并生成密文输出。

这种重复冲洗过程会在每一位纯文本数据中反复发生。但是,重要的是不要再次使用相同的精确键-Nonce 组合,因为它可能导致重复的密钥流。

感到有点困惑?这是提供一些清晰性的可视化过程:

分组密码与流密码图形:基本图,概述了使用流密码的加密过程
流密码示例:这是展示流密码的基本操作的基本说明。

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

0100011001101111011100100010000001110100011010000110010100100000010010000110111101110010011001000110010100100001

因此,如果我们使用流密码对消息进行加密,则每次将加密一次。因此,纯文本数据将被分解为单个位,如下所示:

分组密码与流密码的图形:此图像说明了一条消息,将其分为各个比特进行加密。

是的,阅读一下彩色的图形后,请花一点时间让您的眼睛调整一下。

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

一旦有了密钥流,就可以将伪随机位与纯文本消息的二进制值进行异或。回想起以前的 XOR 表,这意味着,如果纯文本消息的第一位是1,而密钥流的第一位是0,那么输出将是0。如果明文消息的第二位是另一个1,并且密钥流的第一位也是1,那么输出也将是0。得到它?是的,这基本上就是流密码的工作方式。   

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

流密码的一个非常基本的示例是凯撒密码,它是一种将一个字符单独替换为另一个字符的密码。但这是一个非常古老且过时的密码示例。那么,今天我们能找到什么样的流密码?

流密码的例子

  • Salsa20(软件和硬件实现)
  • ChaCha20(Salsa20 的修改版;TLS 1.3支持 ChaCha20 ),
  • 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 倾向于泄漏太多有关您要加密的消息的信息。因此,这里最大的收获是不要依赖 ECB 进行安全加密。

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

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

数据通过密码运行后,输出将链接到随后的后续数据块。此数据链接过程称为显式链接,有助于进一步掩盖您的消息。它通过添加来自上一个块的数据来实现。因此,即使您发送或接收两个完全相同的纯文本消息,由于链接的数据,每个消息的密文也会有所不同。

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

因此,从根本上讲,CBC 模式采用 ECB 模式,并通过添加来自先前 bocks 的数据来提高其复杂性和机密性。但是,它不再经常使用了。为什么?有两个重要原因:

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

CFB 和 OFB 模式都涉及显式链接。IV 的使用是 CBC,CFB 和 OFB 模式的加密和解密步骤的一部分,这是这三种模式的安全性的组成部分。

注意:NIST 确实发布了有关 CBC 模式的附录(NIST SP 800-38A-附录)。本文档指定了 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 模式加密和解密过程的屏幕快照:操作方法和技术的块密码模式建议。

但是,当您到达最后一个块输出时会发生什么?一些用于最终的 XOR 操作;其他被丢弃。

5.计数器(CTR)模式

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

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

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

来自 NIST 的屏幕快照,其为块密码的 CTR 操作模式。 该图分解了加密和解密过程。
NIST SP 800-38A 的 CTR 模式加密和解密过程的屏幕截图:操作方法和技术的块密码模式建议。

是的,我知道,上述所有模式都像一碗字母缩略词的字母汤(ECB,CFB,OFB 等)。但是这些模式(与 FIPS 批准的分组密码算法配合使用)的作用很重要,因为没有它们之一,分组密码就不会运行。这些操作模式有助于保护敏感的,未分类的计算机数据。

如果您对操作方式感到兴奋,或者您很受惩罚,请务必查看 NIST 的出版物(SP 800-38A),以更深入地了解我们上面强调的五种操作方式中的每一种。(它深入探讨了所有数学规范,使我们其余的人眼神有些杂乱。)

您还可以熟悉其他操作模式,例如Galois 计数器模式(GCM)带有密文窃取(XTS)模式的XEX 可调整块密码(包括 AES 模式的 XTS)。但是我们不会在这里讨论所有内容。

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

TL; DR:分组密码与流密码

是的,这是很多信息。但是,我们希望这篇文章为您提供了关于流密码和分组密码,它们的作用以及如何工作的更加清晰的信息。

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

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

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