在DES中使用初始化向量

时间:2015-09-30 07:22:58

标签: cryptography des initialization-vector

假设我们必须使用DES(或Triple DES)加密一些数据。如果使用的IV是8字节,则设置为' 0' 0 (即.IV是一个常数字节[],都设置为0x00),可以吗?或者与首先使用无IV相同?

1 个答案:

答案 0 :(得分:0)

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

很多人担心“那么潜在的攻击者会不会看到IV?”答案是肯定的,但没关系。只有关键需要保密。 IV不需要保密,以显着增强加密的安全性。但它确实需要是随机的。

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

编辑:好的,我会解释为什么这不会阻止一个活跃的攻击者,因为我记得最好的攻击。对于这个解释,我将考虑密码块链接(CBC),因为它是如此常用。您必须将此解释推断到其他模式。因此,密码块链接使用IV对消息的第一个块进行异或,然后在ECB模式下对该块进行加密。该加密的输出是密文块1,但现在它在加密该块之前与消息块2进行异或。该输出在完成后一直与块进行异或。

现在要解密,你就像在ECB模式下一样解密密文的第一个块,然后用加密时使用的相同IV对它进行异或。这会生成纯文本,因为总共加密和解密并与IV进行两次异或,这两个XOR相互抵消。现在你取密码文本块1(不是纯文本,请注意),在解密块2之后,用前面的密文块对XOR输出进行异或。

好的,所以这只是为了简要回顾一下CBC是如何运作的。对于任何块,将密文复制到消息的往返消息是XOR-Encrypt-Decrypt-XOR,其中2个XOR相互抵消。所以现在让我保持这个非常简单,并想象一个超级愚蠢的例子,其中大量的钱将被连接到一个帐户。除帐号外,所有细节都已安排,现在请求。

所以说爱丽丝正在向Bob发送该帐号,并且为了不丢失细节中的解释点,想象一下帐号的长度恰好是10位十进制数,因此适合单个AES块和一个几个字节的填充备用。她将要汇款的帐号加密到:1234567890,将加密的输出与IV进行异或,并将银行和加密的帐号发送给银行的银行进行处理。

除了Eve在Alice和Bob之间运行路由器。假设她知道爱丽丝正计划将钱汇入账户1234567890并且做出有根据的猜测这是加密区块的内容,她可以窃取电汇。

要做到这一点,她将原始的IV和XOR与1234567890进行对比。然后她用自己的帐号4564564560对结果进行异或。她用最终输出替换原始IV,并保持密码文本块不变,转发它鲍勃。 Bob解密该块并获得他将使用原始密码文本块获得的内容。除了现在当他用IV对它进行异或时,他没有得到带有填充的1234567890作为他的纯文本;他得到4564564560.他按照收到的指示将钱转移到夏娃(但不是爱丽丝寄来的那些)。

只要攻击者认为接收方的某些乱码明文可以接受,就可以使用更长的消息进行同样的篡改。我不会在这里解释原因,但是如果你想一想我可以让块X解密到我喜欢的任何东西,只要我能正确猜出原始的纯文本就可以了,我可以使用块X-1解密随机噪音。

使用MAC(作为一些众所周知的协议,如SSL,TLS,IPSec)可以将原始CBC的漏洞加强到这种攻击。通常建议您只使用其中一种协议,除非有充分的理由不能这样做。