我应该使用初始化向量(IV)和我的加密吗?

时间:2008-09-15 19:17:31

标签: encryption cryptography

建议我使用initialization vector来加密/解密我的数据吗?它会让事情更安全吗?是否需要根据具体情况进行评估?

为了将其置于实际上下文中,Win32加密函数CryptSetKeyParam允许在加密/解密之前在密钥上设置初始化向量。其他API也允许这样做。

通常建议什么?为什么?

7 个答案:

答案 0 :(得分:25)

当相同的密钥可能用于加密多条消息时,IV是必不可少的。

原因是,在大多数加密模式下,可以一起分析使用相同密钥加密的两条消息。例如,在简单的流密码中,对使用相同密钥加密的两个密文进行异或,导致两个消息的XOR,使用传统的密码分析技术可以从中轻松提取明文。

弱IV是使WEP易碎的部分原因。

IV基本上将一些独特的非秘密数据混合到密钥中,以防止同一密钥被使用两次。

答案 1 :(得分:9)

在大多数情况下,您应该使用IV。由于每次都会随机生成IV,如果加密相同的数据两次,加密的消息将会不同,观察者也无法说出这两条消息是否相同。

答案 2 :(得分:5)

仔细观察CBC模式的图片(见下文)。您很快就会意识到,知道IV的攻击者就像攻击者知道前一块密文一样(是的,他们已经知道了很多)。

这就是我所说的:当确保数据完整性时,IV = 0的大多数“问题”是块加密模式的一般问题。你必须确保诚信。

以下是我的工作:使用强校验和(加密哈希或HMAC)并在加密前将其添加到您的明文中。有你已知的第一个密文块:它是没有校验和的同一个东西的IV,你需要校验和一百万个其他原因。

最后:CBC和流密码之间的任何类比都不是非常有见地的恕我直言。

只要看看CBC模式的图片,我想你会感到惊喜。

这是一张图片:

http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation

link text

答案 3 :(得分:2)

我发现HTTP Digest Auth(RFC 2617)的写法非常有助于理解IVs / nonce的使用和需求。

答案 4 :(得分:2)

如果多次使用相同的密钥,则可能会在加密结果中出现多个不同的秘密模式。 IV,应该是伪随机的,并且每个密钥只使用一次,就可以对结果进行模糊处理。你永远不应该使用相同的四次使用相同的密钥,这样会破坏它的目的。

不必费心跟踪IV,最简单的事情是将前置或附加到生成的加密秘密。这样你就不用多想了。然后,您将始终知道第一个或最后一个N位是IV。

解密秘密时,你只需拆分IV,然后将其与密钥一起使用来解密秘密。

答案 5 :(得分:1)

  

是否需要根据具体情况对其进行评估   依据?

是的,确实如此。始终阅读您正在使用的密码以及它希望其输入看起来如何。有些密码不使用静脉注射,但确实需要使用盐。 IV可以具有不同的长度。密码的模式可以改变IV用于什么(如果它被使用),结果,它需要什么属性安全(随机,唯一,增量?)。

通常建议使用,因为大多数人习惯在称为“密码块链接”的模式下使用AES-256或类似的分组密码。对于许多工程用途来说,这是一个很好的,明智的默认选择,它需要你有一个合适的(非重复的)IV。在那种情况下,它不是可选的。

答案 6 :(得分:0)

IV允许对明文进行加密,使得加密文本更难以为攻击者解密。您使用的每个IV位将使给定纯文本中加密文本的可能性加倍。

例如,让我们使用IV一个字符长加密'hello world'。随机选择IV为'x'。然后加密的文本是'xhello world',例如'asdfghjkl'。如果我们再次加密它,首先生成一个新的IV - 说这次我们得到'b' - 并且像正常一样加密(从而加密'bhello world')。这次我们得到'qwertyuio'。

关键是攻击者不知道IV是什么,因此必须为给定的纯文本计算每个可能的IV以找到匹配的密文。通过这种方式,IV就像password salt一样。最常见的是,IV与链接密码(流或分组密码)一起使用。在链接块密码中,每个纯文本块的结果被馈送到密码算法以找到下一个块的密文。通过这种方式,每个块都链接在一起。

那么,如果你有一个随机IV用于加密纯文本,你如何解密它?简单。将IV(纯文本)与加密文本一起传递。使用上面的第一个例子,最后的密文将是'xasdfghjkl'(IV +密文)。

是的,您应该使用IV,但一定要正确选择。使用一个好的随机数源来制作它。不要两次使用相同的IV。 从不使用常数IV。

关于initialization vectors的维基百科文章提供了一般概述。