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

本文关键字:阻止我 解密 AES 密文 真的 初始化 向量 操纵 | 更新日期: 2023-09-27 18:15:13

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

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

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

考虑到CBC模式的工作方式,加密数据的IV的变化将只影响第一个解密的数据块。

引用链接文章:

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

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

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

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