C# AES使用无效IV正确地解密了字符串的一半,这正常吗?
我正在测试来自的AES加密函数。我发现,如果我将C# AES使用无效IV正确地解密了字符串的一半,这正常吗?,c#,security,cryptography,aes,C#,Security,Cryptography,Aes,我正在测试来自的AES加密函数。我发现,如果我将IV更改为另一个随机数据,则只有一部分文本将无法访问,而另一部分将正确解密 这是我的代码: public static string encrypt(string original, string key, string iv) { string enc; // Create a new instance of the RijndaelManaged // class. This g
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;
}
例如,我的输入字符串是Hello,我认为雨果是一部很棒的电影代码>。它将使用base64ed keygbpldgjbitwqrqbbyhr+5J0cXADYAm+po8B29rYVJc=
和base64ed IVTi7OcORScdXS/Ll7m1KdeQ=
加密到lbMvxzBtu057yeNV5d/5mc7tlau7zfxmtflsuoba7uemgqrrm23h5h5uiglmdcdcdj3
。(我将base64ed键和IVs作为函数的输入,并在函数中对它们进行解码,正如您在上面的代码中所看到的那样)
现在,如果我将IV更改为m4u5eqD7BZP11P5PYGfV7Q==
,但不接触密钥,然后尝试解密加密字符串,我将给出以下结果:��f+�T\/]�^H�乌戈是一部很棒的电影代码>
如您所见,输入字符串的一部分(ugo是一部很棒的电影!
)已成功解密。通常是这样吗?如果是,如何预防?还有比这更安全的算法吗?如果没有,我的代码有什么问题?如果使用CBC,错误的IV只会阻止第一个块的解密,即AES的前16个字节。这是故意的,不是弱点
有关CBC如何处理IV的详细信息,请参阅。如果使用CBC,错误的IV只会阻止第一个块的解密,即AES情况下的前16个字节。这是故意的,不是弱点
有关CBC如何处理IV的详细信息,请参见。请发布EncryptStringToBytes\u Aes
和DecryptStringToBytes\u Aes
的内容。包含的链接指向Microsoft AES托管类文档,而不是您的代码。答案可能与您正在使用的分组密码模式有关,但如果没有该代码,则很难判断。@akton问题已更新。请发布EncryptStringToBytes\u Aes
和DecryptStringToBytes\u Aes
的内容。使用CBC不会导致上述行为,因为使用一个IV和相同密钥的第一个块的密文将不等于使用第二个IV的第一个块的密文,这意味着第二个块将解密为相同的明文。“发生了其他事情。@akton问题更新为这些函数的内容链接。请发布EncryptStringToBytes\u Aes
和DecryptStringToBytes\u Aes
的内容。包含的链接指向Microsoft AES托管类文档,而不是您的代码。答案可能与您正在使用的分组密码模式有关,但如果没有该代码,则很难判断。@akton问题已更新。请发布EncryptStringToBytes\u Aes
和DecryptStringToBytes\u Aes
的内容。使用CBC不会导致上述行为,因为使用一个IV和相同密钥的第一个块的密文将不等于使用第二个IV的第一个块的密文,这意味着第二个块将解密为相同的明文。“发生了其他事情。@akton问题更新为这些函数的内容链接。是的,我正在使用CBC。”。但是,有没有更好的密码模式,所以错误的IV阻止了整个字符串的解密?@MahdiGhiasi为什么要那个属性?IV不是秘密,它通常包含在密文中,因此攻击者知道IV。IV的目的是使每次加密都不同[在CBC的情况下是不可预测的],因此您可以实现。好吧,我真正的问题是:我想在数据库中存储一些密码,并且(正如该问题的答案所说)我将在数据库中存储IV,并在web.config中存储密钥。。。我对密码学还不熟悉,但我不知道确切的原因:)我只是在寻找最安全的方法将这些密码存储在远程数据库中。你认为呢?有没有更好的方法来存储这些密码?你可以添加一个MAC,但除此之外,AES CBC也可以。是的,我正在使用CBC。但是,有没有更好的密码模式,所以错误的IV阻止了整个字符串的解密?@MahdiGhiasi为什么要那个属性?IV不是秘密,它通常包含在密文中,因此攻击者知道IV。IV的目的是使每次加密都不同[在CBC的情况下是不可预测的],因此您可以实现。好吧,我真正的问题是:我想在数据库中存储一些密码,并且(正如该问题的答案所说)我将在数据库中存储IV,并在web.config中存储密钥。。。我对密码学还不熟悉,但我不知道确切的原因:)我只是在寻找最安全的方法将这些密码存储在远程数据库中。你认为呢?有没有更好的方法来存储这些密码?你可以添加一个MAC,但除此之外,AES CBC也可以。