我应该使用初始化向量(IV)以及我的encryption吗?

build议使用初始化vector来encryption/解密我的数据吗? 它会使事情更安全吗? 这是否需要逐案评估?

为了将其应用到实际环境中,Win32encryption函数CryptSetKeyParam允许在encryption/解密之前在密钥上设置初始化vector。 其他API也允许这样做。

什么是一般build议,为什么?

当相同的密钥可能用于encryption多个消息时,IV是必不可less的。

原因是因为在大多数encryption模式下,用同一个密钥encryption的两个消息可以一起分析。 例如,在一个简单的stream密码中,异或用相同的密钥encryption的两个密文导致两个消息的XOR,从中可以使用传统的密码分析技术容易地提取明文。

弱四是WEP易碎的一部分。

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

在大多数情况下,你应该使用IV。 由于IV是每次随机产生的,如果你两次encryption相同的数据,encryption的消息将会不同,观察者不可能说这两个消息是否相同。

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

这就是我所说的:当你确保数据的完整性时,IV = 0的大部分“问题”是块encryption模式的一般问题。 你真的必须确保完整性。

这就是我所做的:使用强大的校验和(encryption哈希或HMAC),并在encryption之前将其join到您的明文中。 有一个你已知的第一个密文块:它是没有校验和的同一个事物的第四个块,你需要一百万个其他的校验和。

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

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

这是一张图片:

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

链接文本

我发现HTTP Digest Auth( RFC 2617 )的写作对理解IVs /随机数的使用和需求非常有帮助。

IV允许对明文进行encryption,使得encryption文本难以被攻击者解密。 你使用的每一位IV都会使来自给定纯文本的encryption文本的可能性加倍。

例如,我们使用一个长度为1的字符来encryption“hello world”。 IV被随机select为“x”。 然后被encryption的文本就是“xhello world”,这些文件就是“asdfghjkl”。 如果我们再次encryption,首先产生一个新的IV – 比如说我们这次得到'b' – 并且像正常一样encryption(因此encryption'bhello world')。 这次我们得到'qwertyuio'。

重点是攻击者不知道IV是什么,因此必须计算给定纯文本的每个可能的IV以find匹配的密文。 这样,IV就像密码盐一样行事。 最常见的情况是,IV与链接密码(stream或分组密码)一起使用。 在链接分组密码中,每个纯文本块的结果被送到密码algorithm,以find下一个块的密文。 这样,每个块都链接在一起。

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

是的,你应该使用IV,但一定要正确select它。 使用一个好的随机数字来源。 永远不要使用相同的IV两次。 永远不要使用常量IV。

维基百科有关初始化向量的文章提供了一个总体概述。

如果相同的密钥被多次使用,多个不同的秘密模式可能出现在encryption结果中。 IV应该是伪随机的,每个关键字只能使用一次,这样就会混淆结果。 你不应该使用相同的密钥两次相同的密钥,这将打败它的目的。

为了不必追踪IV,最简单的事情就是将其join或附加到所产生的encryption秘密中。 这样你就不必多想了。 然后你将总是知道第一个或最后一个N位是IV。

当解密秘密时,你只需将IV分离出来,然后和密钥一起使用来解密秘密。

这是否需要逐案评估?

是的。 请务必阅读您正在使用的密码以及期待input内容的外观。 一些密码不使用IV,但要求盐是安全的。 IV可以是不同的长度。 密码的模式可以改变IV的用途(如果它被使用的话),结果,它需要什么样的属性(随机的,唯一的,增量的)。

一般build议这样做,因为大多数人习惯于在称为“密码块链接”的模式下使用AES-256或类似的块密码。 这对于很多工程应用来说是一个很好的,合理的默认设置,它需要你有一个合适的(不重复的)IV。 在这种情况下,它不是可选的。