Blowfish、AES、RC4、DES 和 Seal 等加密算法是在两类密码之一中实现的。密码类型的优点/缺点是什么?
流与块密码的优缺点
虽然两者都是对称密码,但流密码基于生成“无限”密码密钥流,并使用它一次加密一位或字节(类似于一次性密码),而分组密码适用于更大的数据块(即块)一次,通常组合块以增加安全性(例如 CBC 模式下的 AES)。
- 流密码通常比块密码快,但这有它自己的代价。
- 块密码通常需要更多内存,因为它们处理更大的数据块,并且经常从以前的块中“结转”,而由于流密码一次只处理几位,它们的内存需求相对较低(因此更便宜在有限的场景中实现,例如嵌入式设备、固件和尤其是硬件)。
- 流密码更难以正确实现,并且在使用上容易出现弱点 - 由于原理类似于一次性密码,因此密钥流有非常严格的要求。另一方面,这通常是棘手的部分,可以卸载到例如外部盒子。
- 因为分组密码一次加密整个块(并且还有最推荐的“反馈”模式),所以它们更容易受到传输噪声的影响,也就是说,如果你弄乱了数据的一部分,其余的可能都是不可恢复。而对于流密码,字节是单独加密的,与其他数据块没有连接(在大多数密码/模式中),并且通常支持在线中断。
- 此外,流密码不提供完整性保护或身份验证,而一些分组密码(取决于模式)除了机密性之外还可以提供完整性保护。
- 由于上述所有原因,流密码通常最适合数据量未知或连续的情况 - 例如网络流。另一方面,分组密码在数据量是预先知道的情况下更有用 - 例如文件、数据字段或请求/响应协议,例如 HTTP ,其中总消息的长度已经在开始。
块密码是一种通用算法,它实现了值的依赖于密钥的排列,这些值是固定位数的序列(称为“块”)。它可用于多种密码协议中的各种角色。其中一种作用是对长数据流进行批量加密。要实现这样的事情,分组密码必须与适当的操作模式(又名“链接模式”)一起使用,传统的模式是 CBC,而新潮的模式是 CTR。
流密码是一种专门用于对长数据流进行批量加密的算法。这个想法是,通过放弃分组密码的多功能性,可以创建更有效的算法(即更快地加密数据的算法)。
如果对两个不同的流使用相同的密钥两次,而没有适当的、唯一/足够随机的初始化向量,则具有面向流的加密模式的分组密码和流密码都可能遇到安全问题。对于 CBC 加密,对于每条新消息,IV 必须是新的统一随机位序列,其大小与块相同。好的流密码也接受 IV。一种称为RC4的传统流密码是无 IV 的(它的规范没有说明 IV 可以插入的位置或方式),这导致了很多混乱,并给流密码的概念起了一个坏名声。
有关更新、更安全(和更快)的流密码,请参阅eSTREAM 产品组合。这些算法经过了许多密码学家的相当彻底的分析,被认为是“相当安全的”。
通过加密一长串零值字节,可以将流密码转换为伪随机数生成器。实际上,许多(但不是全部)流密码在内部通过 PRNG 工作,生成一长串依赖于密钥的伪随机字节,随后(通过按位 XOR)与数据组合以加密(或解密),所以加密零字节相当于完全省略 XOR。因此,流密码通常用作自定义 PRNG。
前面没有提到的流密码的一个优点是它们不需要填充(块密码在完整的块上运行,所以如果你没有足够的数据,你必须以某种方式生成更多)。令人惊讶的是(不是真的,密码学是墨菲无处不在的领域),填充可能会出错,例如Practical Padding Oracle Attacks中的例子。
此外,分组密码的安全性在很大程度上取决于它们的操作模式,你仍然会看到 ECB 有时在这里和那里使用,它并不比没有加密好多少。
基本上你不能说一个比另一个更好,一个人必须查看一个完整的密码系统来做出安全判断。
流密码使用随机比特流加密明文数据(通常使用 XOR,因为它可以很容易地反转)。如果您有 128 位数据,您将使用 128 位 psedurandom strem(您的密钥)进行加密。
块密码使用相同的转换(基于密钥)一次加密一个块的纯文本数据。所以你有你的 128 位数据,密码将它分成块(如 32 位的 4 个块),并对每个块应用相同的转换,获得 4 个加密块,组合起来将形成最终的密码。
当然,正因为如此,Block Cyphers 更安全,但在所涉及的硬件复杂性方面使用起来很昂贵。流密码更快且“便宜”,但如果实施不正确,它们可能会受到安全问题的影响。