我根据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?
答案 0 :(得分:1)
SymmetricAlgorithm
的默认操作模式为CipherMode.CBC
。
考虑到how the CBC mode works加密数据 IV 的更改只会影响第一个解密的数据块。
引用链接文章:
使用不正确的IV解密会导致第一个明文块 腐败但随后的明文块将是正确的。这是 因为明文块可以从两个相邻的块中恢复 密文。结果,解密可以并行化。注意 对密文进行一位更改会导致完全损坏 相应的明文块,并反转相应的 位于下面的明文块中,但是其余的块 保持完整。
这是没有身份验证加密(例如here)不是一个好主意的原因之一。
另一方面,在加密期间更改 IV 会导致完全不同的密文,因为第一个块中的更改会传播到所有后续块。
Desclaimer:我不是加密专家,所以请确认我的想法。