1

我根据 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,并没有真正做任何事情(尤其是在较长的文档上)。为什么我们甚至需要静脉注射?

4

1 回答 1

1

的默认操作模式SymmetricAlgorithmCipherMode.CBC

鉴于CBC 模式的工作方式,加密数据IV的更改将仅影响第一个解密的数据块。

引用链接的文章:

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

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

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

免责声明:我不是加密专家,所以请验证我的想法。

于 2015-10-01T09:50:47.140 回答