从浏览:http: //msdn.microsoft.com/en-us/library/ms229741.aspx
熵提供 16 字节(128 位)初始化向量,而不是加密盐。
您通常不需要对 IV 保密[1],您只需要注意不要重复使用相同的 IV(如果它是随机生成的,则不会发生这种情况,因为有 2 128个可能的值)。
初始化向量的目的是在加密之前初始随机化您的消息(通常只是第一个块)。
比较不需要 IV 的电子密码本 (ECB)和需要 IV 的密码块链接。
假设您有一些加密功能encrypted_block = Encrypt(block, key)
,它将采用一个固定大小的数据块(比如 128 位)、一个秘密加密密钥并返回一个加密的数据块,可以使用block = Decrypt(encrypted_block, key)
. 因此,如果您使用 128 位块大小加密 10 kB 文件,那么您有 640 个块要加密。如果原始的两个块是相同的(比如说它是一个熵很小的图像),那么最后的加密块最终将是相同的,并且通常可以辨别出模式。因此,ECB 基本上只是将文件拆分为块并将加密功能单独应用于每个块(不依赖于先前块的输出)。
现在让我们看看像 CBC 这样使用初始化向量 (IV) 的方案。第一个块由 加密encrypted_block_0 = Encrypt(block_0 ^ IV, key)
,其中^
是 XOR(按位异或运算符)。下一个块被加密encrypted_block_1 = Encrypt(block_1 ^ encrypted_block_0, key)
; 也就是说,您在输入加密函数之前使用前一个块的加密结果来“随机化”当前块。现在,如果他们没有对第一个块使用初始化向量,则可以通过观察前几个块来推断事情。例如,如果您有两个具有相同初始化向量的加密文件,并且看到前 10 个块是相同的,您将了解到明文文件的前 10 个块是相同的,并且您会获得额外的信息。并不是说仅仅知道明文中的 IV 对你一点帮助都没有,因为它在一个复杂的非线性Encrypt
函数中,你不知道秘密就无法反转key
。
编辑:实际上,我认为在 DPAPI 中将 16 个字节用作初始化向量是错误的;这是微软秘密 DPAPI 的逆向工程:http: //cdn.ly.tl/publications/Recovering-Windows-Secrets-and-EFS-Certi%EF%AC%81cates-Of%EF%AC%82ine.pdf