操作初始化向量不会(真的)阻止我解密AES密文

时间:2015-09-30 14:14:09

标签: c# encryption aes initialization-vector

我根据MSDN上的示例创建了以下类: https://gist.github.com/anonymous/19d9e5f6747dfe75d553

每当我像这样使用它时,似乎加密就好了:

var key = Crypto.GenerateKey();
var vector = Crypto.GenerateVector(key);

var cypherText = Crypto.EncryptBase64("abcdefghijklmnopqrstuvwxyz1234567890", key, vector);
vector = Crypto.GenerateVector(key);
var plainText = Crypto.Decrypt(cypherText, key, vector);

然后plainText包含以下内容:

�\aU��(���P\u0003�b\u001dxqrstuvwxyz1234567890

所以它似乎改变了IV,并没有真正做任何事情(特别是在较长的文件上)。为什么我们甚至需要IV?

1 个答案:

答案 0 :(得分:1)

SymmetricAlgorithm的默认操作模式为CipherMode.CBC

考虑到how the CBC mode works加密数据 IV 的更改只会影响第一个解密的数据块。

引用链接文章:

  

使用不正确的IV解密会导致第一个明文块   腐败但随后的明文块将是正确的。这是   因为明文块可以从两个相邻的块中恢复   密文。结果,解密可以并行化。注意   对密文进行一位更改会导致完全损坏   相应的明文块,并反转相应的   位于下面的明文块中,但是其余的块   保持完整。

这是没有身份验证加密(例如here)不是一个好主意的原因之一。

另一方面,在加密期间更改 IV 会导致完全不同的密文,因为第一个块中的更改会传播到所有后续块。

Desclaimer:我不是加密专家,所以请确认我的想法。