加密算法(例如Blowfish,AES,RC4,DES和Seal)是在两种密码之一中实现的。密码类型的优点/缺点是什么?

#1 楼

虽然两者都是对称密码,但流密码基于生成“无限”的加密密钥流,并使用该密钥流一次加密一个位或一个字节(类似于一次性填充),而分组密码则可处理更大的数据块(即块)一次,通常结合使用块以提高安全性(例如CBC模式下的AES)。


流密码通常比块加密更快,但这要有自己的价格。
块密码通常需要更多的内存,因为它们处理较大的数据块并且通常从先前的块中“继承”,而由于流密码一次仅处理几个位,因此它们的内存需求相对较低(
流密码更难以正确实施,并且容易因使用情况而产生弱点-因为其原理类似于以下内容-在时间垫上,密钥流有非常严格的要求。另一方面,这通常是棘手的部分,可以卸载到例如一个外接盒。
因为块密码一次加密一个完整的块(并且还建议使用“反馈”模式),所以它们更容易受到传输噪声的影响,也就是说,如果您弄乱了一部分数据,则全部其余的可能无法恢复。而使用流密码字节是单独加密的,没有与其他数据块的连接(在大多数密码/模式下),并且通常支持在线中断。
此外,流密码不提供完整性保护或身份验证,而某些分组密码(取决于模式)除提供机密性外,还可以提供完整性保护。
由于上述所有原因,流密码通常最适合于数据量未知或连续的情况(例如网络流)。另一方面,当密码的数量是已知的(例如文件,数据字段或请求/响应协议,例如HTTP)时,分组密码或更有用。开始。


评论


第二个项目符号不正确。与先前块“继续”产生的内存差异可以忽略不计,并且比算法与算法之间的内存差异小得多(例如,将RC4(内部状态为256字节)与AES(内部状态为0字节)进行比较在某些方面)。最后一个项目符号有误,是不好的建议。

– D.W.
2011年1月8日,0:45

@ D.W。第二个项目符号是“一般而言”,因为通常是这种情况(但是我接受这并不严格准确)。

–AVID♦
2011年1月8日23:31

@ D.W。您对上一个项目符号的评论有什么依据吗?错误的区别在哪里,为什么您说这是不好的建议?

–AVID♦
2011年1月8日在23:32

是的,我有理由发表对最后一个项目符号的评论。似乎全都感到困惑。分组密码适用于流数据。请参阅CBC模式,CTR模式等,以了解适用于流数据的各种操作模式。分组密码不限于事先知道数据量的情况。我不知道有任何理由认为流密码比流数据的分组密码更好(尽管有名称)。

– D.W.
2011年4月3日,下午3:09

D.W.是正确的:“流密码”中的“流”一词表示存在密钥流-与纯文本组合以生成密文的比特流。它不反映明文的组成。显然,这是一个细节,通常会使开发人员和工程师感到困惑,而后者通常隐含在其中。分组密码可以很好地用于处理流式纯文本。同样令人困惑的是,当块大小为原子(例如1字节)时,块密码可以用作具有适当操作模式的流密码。

–莱斯·哈兹伍德
2011年9月29日下午0:58

#2 楼

分组密码是一种通用算法,它实现与密钥有关的值的排列,这些值是固定位数的序列(称为“块”)。它可以用于多种加密协议中的各种角色。一种这样的作用是对长数据流进行批量加密。为了实现这一目标,必须将分组密码与适当的操作模式(也称为“链接模式”)一起使用,传统的操作模式为CBC,而新的更新模式为CTR。

cipher是一种专用算法,用于批量加密长数据流。这个想法是,通过放弃分组密码的多功能性,有可能创建一种更高效的算法(即可以更快地对数据进行加密的算法)。

两种面向流加密的分组密码如果对于两个不同的流两次使用同一密钥,而没有适当的,唯一的/足够随机的初始化向量,则密码模式和流密码可能会遇到安全问题。对于CBC加密,对于每个新消息,IV必须是一个新的均匀随机的比特序列,其大小与块相同。好的流密码也接受IV。传统的称为RC4的流密码是无IV的(它的规范没有说明IV的插入位置或插入方式),这导致了很多混乱,并给流密码的概念起了不好的名字。

有关更新,更安全(和更快)的流密码,请参阅eSTREAM产品组合。这些算法已被许多密码学家进行了相当彻底的分析,被认为是“相当安全的”。

通过加密值零的长字节序列,可以将流密码转换为伪随机数生成器。实际上,许多(但不是全部)流密码通过作为PRNG来内部工作,生成一长串与密钥相关的伪随机字节,然后将其与数据进行组合(通过按位XOR)以进行加密(或解密),因此加密零字节等效于完全省略XOR。因此,流密码通常用作自定义PRNG。

评论


您忘了提到哪个通常更安全(流与块)。

–trusktr
13-10-22在16:24

我没有忘记,因为断言没有任何常识。如果分组密码和流密码正确应用并且没有结构上的弱点,则它们都可以提供足够的安全性。

–托马斯·波宁(Thomas Pornin)
13-10-22在16:30

“分组密码的通用性”这部分我很麻烦。是什么使分组密码从本质上更具通用性?分组密码既可以用于加密和认证流(例如TLS)或打包数据(例如ESP),也可以用于流密码(例如TLS或DTLS)。在某些情况下,流密码看起来更“自然”(例如,加密音频)或分块密码看起来更“自然”(例如,加密磁盘),但是我只是在合理的应用程序中看不到两者之间有很大的差距。

–丹·伦斯基
18年7月22日在17:54

#3 楼

之前未提到的流密码的一个优点是它们不需要填充(块密码在完整的块上运行,因此,如果您没有足够的数据,则必须以某种方式生成更多的数据)。令人惊讶的是(实际上不是密码术在墨菲所处的领域),填充操作可能做错了,例如在《实用填充Oracle攻击》中得到了证明。

分组密码的安全性在很大程度上也取决于它们的模式。在操作上,您仍然会发现ECB有时会在这里和那里使用,并且它根本不比没有加密好得多。

基本上,您不能说一个比另一个更好,一个必须看一下进行安全判断的完整密码系统。

评论


在您的第一段中:有些分组密码的操作模式不需要填充,例如:CTR模式。因此,这并不是流密码所独有的优势。但是对您的最后一段+1 –说得好!

– D.W.
2011年4月3日,下午3:17

好吧,我想说CTR和OFB是从分组密码制作流密码的构造。分组密码的另一大优点是,它们可以轻松地用作其他事物的构建块,无论是流密码还是单向哈希。流密码不是那么通用。

–布鲁诺·罗埃(BrunoRohée)
2011年4月3日,下午5:38

您忘了提到哪个通常更安全(流与块)。

–trusktr
13-10-22在16:24

从本质上讲,没有一种方法会更安全,这就是您使用它们的方式。

–布鲁诺·罗埃(BrunoRohée)
13-10-23在13:45

#4 楼

Stream Ciphers使用随机的比特流(通常是XOR,因为它很容易被逆转)对明文数据进行加密。
如果您有128位数据,则​​将使用128位psedurandom strem(您的密钥)进行加密。

块密码器以相同的转换一次加密一个纯文本数据块。 (基于密钥)。因此,您拥有128位数据,密码将其分为多个块(例如4个32位块),并将相同的变换应用于每个块,以获得4个加密的块,这些组合在一起将形成最终的密码。

当然,由于这个原因,分块密码器更安全,但使用起来却涉及到硬件复杂性。
流密码器更快,更“便宜”,但如果实施不当,则容易受到安全性问题的影响。

评论


最后一段有许多事实错误。通常,分组密码并不安全,在硬件上也不一定会更差。流密码不一定更快或更便宜。

– D.W.
2011年1月8日,0:43

@ D.W .:尽管如此,流密码通常比分组密码更快或更便宜,因为这样做是对的:用途较少的算法可以提高性能。比AES / CTR更慢,更昂贵的流密码根本无法使用。

–托马斯·波宁(Thomas Pornin)
2012年1月3日14:07

您忘了提到哪个通常更安全(流与块)。

–trusktr
13-10-22在16:25

#5 楼

数据(要加密的内容)通常以流的形式出现。要对其进行加密,我们需要采用流密码,即适用于数据流的加密算法。流是任意长度,可变长度或未指定长度的位(或字节)序列。到目前为止,我们发明的最佳密码通常是分组密码。分组密码能够加密单个固定大小的数据块;而且,根据我们周围的证据,显然,构建良好的分组密码要比流密码更容易。

好消息。通过以某些特定模式(“操作模式”)使用给定的分组密码,并借助特定的填充策略,我们可以将任何分组密码转换为流密码!这意味着我们可以使用更好的密码(即分组密码)来加密任何数据,其中大部分来自流。

评论


第二句话似乎具有误导性。您可以通过使用多种标准操作模式(例如CBC模式,CTR模式等)中的任何一种,使用分组密码对流数据进行加密。AES-CBC仍然是分组密码。实际上,几乎每个分组密码的标准操作模式都已经支持流数据。此外,如果没有操作模式,分组密码是不安全的,因此,操作模式并不是某些仅在要加密流数据时才需要的可选事物。

– D.W.
2011年4月3日,下午3:16