我正在测试this example的AES加密函数。我发现如果我将IV
更改为另一个随机数据,则只有部分文本将无法访问,而另一部分将正确解密。
这是我的代码:
public static string encrypt(string original, string key, string iv)
{
string enc;
// Create a new instance of the RijndaelManaged
// class. This generates a new key and initialization
// vector (IV).
// Encrypt the string to an array of bytes.
byte[] encrypted =EncryptStringToBytes_Aes(original, Convert.FromBase64String(key), Convert.FromBase64String(iv));
enc = Convert.ToBase64String(encrypted);
return enc;
}
public static string decrypt(string encrypted, string key, string iv)
{
string decrypted;
decrypted = DecryptStringFromBytes_Aes(Convert.FromBase64String(encrypted), Convert.FromBase64String(key), Convert.FromBase64String(iv));
return decrypted;
}
And these are my EncryptStringToBytes_Aes
and DecryptStringFromBytes_Aes
functions.
例如,我的输入字符串是Hello, I think Hugo is a great movie!
。它将使用 base64ed 键lbMvxzBtu057yeNV5d/5MC7tlau7zfRXMtfLSUOBa7ueMGqRrm23H5uYGLmDcdJ3
和 base64ed IV gbpldgjBitwQXrQbbyHr+5J0cXADYAm+po8B29rYVJc=
加密到Ti7OcORScdXS/Ll7m1KdeQ==
。 (我得到base64ed键和IV作为我的函数的输入,我在我的函数中解码它们,正如你在上面的代码中看到的那样)
现在,如果我将IV更改为m4u5eqD7BZP11P5PYGfV7Q==
但是没有触摸密钥,那么尝试解密加密的字符串,我会给出这个结果:��f+�T\/]�^h�ugo is a great movie!
。
如您所见,输入字符串(ugo is a great movie!
)的一部分已成功解密。这是通常的吗?如果是,如何防止这种情况?还有其他比这更安全的算法吗?如果不是,我的代码出了什么问题?
答案 0 :(得分:5)
如果使用CBC,则错误的IV仅阻止第一个块的解密,即AES的情况下的前16个字节。这是设计而不是弱点。
有关CBC如何处理IV的详细信息,请参阅Can CBC ciphertext be decrypted if the key is known, but the IV not?。