是否建议我使用初始化向量来加密/解密我的数据?它会让事情更安全吗?这是需要逐案评估的事情之一吗?
为了将其置于实际上下文中,Win32 加密函数CryptSetKeyParam允许在加密/解密之前在密钥上设置初始化向量。其他 API 也允许这样做。
一般推荐什么,为什么?
是否建议我使用初始化向量来加密/解密我的数据?它会让事情更安全吗?这是需要逐案评估的事情之一吗?
为了将其置于实际上下文中,Win32 加密函数CryptSetKeyParam允许在加密/解密之前在密钥上设置初始化向量。其他 API 也允许这样做。
一般推荐什么,为什么?
当同一密钥可能用于加密多条消息时,IV 是必不可少的。
原因是,在大多数加密模式下,可以同时分析使用相同密钥加密的两条消息。例如,在一个简单的流密码中,对使用相同密钥加密的两个密文进行异或运算会导致两个消息的异或,使用传统的密码分析技术可以很容易地从中提取明文。
弱 IV 是 WEP 易碎的部分原因。
IV 基本上将一些唯一的、非秘密的数据混合到密钥中,以防止同一个密钥被使用两次。
在大多数情况下,您应该使用 IV。由于 IV 每次都是随机生成的,如果你对相同的数据进行两次加密,加密的消息就会不同,观察者无法判断这两条消息是否相同。
仔细看一张 CBC 模式的图片(见下文)。您很快就会意识到,知道 IV 的攻击者就像知道前一个密文块的攻击者一样(是的,他们已经知道很多了)。
这就是我所说的:当您不确保数据完整性时,IV=0 的大多数“问题”都是块加密模式的一般问题。你真的必须确保完整性。
这就是我所做的:使用强校验和(加密哈希或 HMAC)并在加密之前将其添加到您的明文中。这是您已知的第一个密文块:它是没有校验和的同一事物的 IV,并且您出于一百万个其他原因需要校验和。
最后: CBC 和流密码之间的任何类比都不是非常有见地恕我直言。
看看CBC模式的图片,我想你会感到惊喜。
这是一张图片:
http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation
如果同一密钥多次用于多个不同的秘密模式,则加密结果中可能会出现。IV应该是伪随机的并且每个密钥只使用一次,用于混淆结果。您永远不应该使用相同的密钥两次使用相同的 IV,这会破坏它的目的。
为了不必费心跟踪 IV,最简单的方法是将其添加或附加到生成的加密机密中。这样你就不用多想了。然后,您将始终知道第一个或最后 N 位是 IV。
解密秘密时,您只需拆分 IV,然后将其与密钥一起使用来解密秘密。
我发现 HTTP Digest Auth ( RFC 2617 ) 的文章对于理解 IV/nonce 的使用和需求非常有帮助。
这是需要逐案评估的事情之一吗?
是的。始终阅读您正在使用的密码以及它期望其输入的外观。一些密码不使用 IV,但确实需要盐以确保安全。IV 可以有不同的长度。密码的模式可以改变 IV 的用途(如果它被使用的话),因此,它需要哪些属性是安全的(随机的、唯一的、增量的?)。
通常建议使用它,因为大多数人习惯于在称为“密码块链接”的模式下使用 AES-256 或类似的块密码。对于许多工程用途来说,这是一个很好的、明智的默认选择,它需要你有一个适当的(非重复的)IV。在这种情况下,它不是可选的。
IV 允许对明文进行加密,从而使加密的文本更难被攻击者解密。您使用的每一位 IV 都会使给定纯文本中加密文本的可能性加倍。
例如,让我们使用一个字符长的 IV 来加密“hello world”。IV 被随机选择为“x”。然后加密的文本是“xhello world”,例如“asdfghjkl”。如果我们再次加密它,首先生成一个新的 IV——比如这次我们得到“b”——然后像往常一样加密(从而加密“bhello world”)。这次我们得到'qwertyuio'。
关键是攻击者不知道 IV 是什么,因此必须计算给定纯文本的每个可能的 IV 以找到匹配的密文。这样,IV 就像密码 salt一样。最常见的是,IV 与链接密码(流密码或分组密码)一起使用。在链接块密码中,每个纯文本块的结果被馈送到密码算法以找到下一个块的密文。这样,每个块都链接在一起。
那么,如果你有一个用于加密纯文本的随机 IV,你如何解密它呢?简单的。将 IV(纯文本)与您的加密文本一起传递。使用我们上面的第一个示例,最终的密文将是“xasdfghjkl”(IV + 密文)。
是的,您应该使用 IV,但一定要正确选择它。使用一个好的随机数源来制作它。永远不要使用相同的 IV 两次。并且永远不要使用常量 IV。
关于初始化向量的 Wikipedia 文章提供了一般概述。