假设我们必须使用 DES(或 Triple DES)加密一些数据。如果使用的 IV 是 8 个字节,设置为 '0'(即 IV 是一个常量 byte[],都设置为 0x00),可以吗?还是和一开始不使用静脉注射一样?
1 回答
这不好。任何硬编码的 IV 意味着相同的纯文本将始终加密为相同的密文。这正是 IV 旨在防止的。如果您使用完全允许 IV 的模式,一个非常好的方法是随机生成 IV,在要加密的所有纯文本块的加密中使用它,然后将未加密的 IV 预先添加到密文中.
很多人担心“那么潜在的攻击者不会看到 IV 吗?” 答案是肯定的,但没关系。只有密钥需要保密。IV 不需要保密以显着增强加密的安全性。但是,它确实需要是随机的。
请注意,这不足以阻止主动攻击者。但这足以阻止任何被动窃听者。
编辑:好的,我将解释为什么这不会阻止积极的攻击者,因为我最好记得这次攻击。对于这个解释,我将考虑密码块链接 (CBC),因为它非常常用。您必须将此解释外推到其他模式。因此,密码块链接 XOR 与 IV 的消息的第一个块,然后加密该块,就像在 ECB 模式下发生的那样。该加密的输出是密文块 1,但现在在该块被加密之前,它与消息块 2 进行了异或运算。该输出一直与它后面的块进行异或运算直到结束。
现在要解密,您可以像在 ECB 模式下一样解密密文的第一个块,然后将其与加密时使用的相同 IV 进行异或。这会产生纯文本,因为您总共加密和解密并与 IV 进行了两次异或,这两个异或相互抵消。现在您获取密文块 1(不是纯文本,请注意),在解密块 2 后,将输出与前面的密文块进行异或。
好的,所有这些只是简要回顾一下 CBC 的工作原理。然后,从密文到任何块的消息的往返消息是 XOR-Encrypt-Decrypt-XOR,其中 2 个 XOR 相互抵消。所以现在让我保持这个非常简单,并想象一个超级愚蠢的例子,其中大量资金即将汇入账户。除帐号外,所有详细信息都已安排好,现在要求提供。
假设 Alice 将那个帐号发送给 Bob,为了不丢失细节中的解释要点,假设帐号正好是 10 位十进制数字,因此适合包含几个字节的单个 AES 块填充备用。她加密了她想汇款到的帐号:1234567890,将加密的输出与 IV 进行异或,并将 IV 和加密的帐号发送给银行的 Bob 进行处理。
除了 Eve 在 Alice 和 Bob 之间运行一个路由器。假设她知道 Alice 正计划向账户 1234567890 电汇,并让有根据的猜测这是加密块的内容,她可以窃取电汇。
为此,她获取原始 IV 并将其与 1234567890 进行异或。然后她将结果与她自己的帐号 4564564560 进行异或。她将原始 IV 替换为最终输出,并保持密文块不变,将其转发给 Bob . Bob 解密该块并得到他使用原始密文块得到的准确信息。除了现在当他用 IV 异或时,他没有得到 1234567890 和填充作为他的纯文本;他得到 4564564560。他按照他收到的指令将钱转给 Eve(但不是 Alice 发送的指令)。
只要攻击者认为接收方的一些乱码纯文本是可以接受的,那么对于更长的消息,同样的篡改也是可能的。我不会在这里解释为什么,但如果你想一想,我可以让块 X 解密为我喜欢的任何东西,只要我能正确猜出原始纯文本并且我对块 X-1 解密没问题到随机噪声。
使用 MAC(正如 SSL、TLS、IPSec 等一些知名协议所做的那样)是增强原始 CBC 对这种攻击的脆弱性的一种方法。通常建议您只使用其中一种协议,除非有充分的理由不能这样做。