Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# AES使用无效IV正确地解密了字符串的一半,这正常吗?_C#_Security_Cryptography_Aes - Fatal编程技术网

C# AES使用无效IV正确地解密了字符串的一半,这正常吗?

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

我正在测试来自的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;
    }

例如,我的输入字符串是
Hello,我认为雨果是一部很棒的电影。它将使用base64ed key
gbpldgjbitwqrqbbyhr+5J0cXADYAm+po8B29rYVJc=
和base64ed IV
Ti7OcORScdXS/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也可以。