DES中初始化向量的使用

Use of Initialization Vector in DES

假设我们必须使用 DES(或三重 DES)加密一些数据。如果使用的IV是8字节,设置为'0'(即IV是常量byte[],全部设置为0x00),可以吗?或者它与一开始不使用 IV 一样吗?

不行。任何硬编码的 IV 都意味着相同的纯文本将始终加密为相同的密文。这正是 IV 旨在防止的。如果您使用完全允许 ​​IV 的模式,一个非常好的方法是随机生成 IV,在您要加密的所有纯文本块的加密中使用它,然后将未加密的 IV 添加到密文中.

很多人担心"Won't a would-be attacker see the IV then?"答案是肯定的,但没关系。只有密钥需要保密。 IV 无需保密即可显着增强加密的安全性。但是,它确实需要是随机的。

请注意,这不足以阻止主动攻击者。但这足以阻止任何被动窃听者。

编辑:好的,我将解释为什么这不会阻止主动攻击者,因为我记得这次攻击是最好的。对于此解释,我将考虑密码块链接 (CBC),因为它非常常用。您必须将此解释外推到其他模式。因此,密码块链接将消息的第一个块与 IV 进行异或运算,然后像在 ECB 模式下发生的那样对该块进行加密。该加密的输出是密文块 1,但现在在该块被加密之前,它与消息块 2 进行了异或运算。该输出与它之后的块一直异或到最后。

现在要解密,您可以像在 ECB 模式下一样解密密文的第一块,然后将其与加密时使用的相同 IV 进行异或运算。这会产生纯文本,因为您总共对 IV 进行了两次加密、解密和异或运算,并且这 2 个异或运算相互抵消了。现在你获取密文块 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。

只要攻击者认为接收方的一些乱码纯文本是可以接受的,就可以对较长的消息进行同样的篡改。我不会在这里解释为什么,但是如果你考虑一下,我可以把块 X 解密成任何我喜欢的东西,只要我能正确猜出原始纯文本并且我对块 X-1 解密没问题到随机噪声。

使用 MAC(如 SSL、TLS、IPSec 等一些知名协议所做的那样)是一种增强原始 CBC 对这种攻击的脆弱性的方法。通常建议您只使用其中一种协议,除非有充分的理由不能这样做。