AES用无效的IV正确解密了一半的字符串,这很常见



我正在测试这个示例中的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;
    }

这是我的EncryptStringToBytes_AesDecryptStringFromBytes_Aes函数。

例如,我的输入字符串是Hello, I think Hugo is a great movie!。它将使用base64ed密钥gbpldgjBitwQXrQbbyHr+5J0cXADYAm+po8B29rYVJc=base64edIV Ti7OcORScdXS/Ll7m1KdeQ==加密到lbMvxzBtu057yeNV5d/5MC7tlau7zfRXMtfLSUOBa7ueMGqRrm23H5uYGLmDcdJ3。(我得到base64ed密钥和IV作为我的函数的输入,我在函数中对它们进行解码,正如你在上面的代码中看到的那样)

现在,如果我将IV更改为m4u5eqD7BZP11P5PYGfV7Q==,但不接触密钥,然后尝试解密加密的字符串,我会给出这样的结果:��f+�T/]�^h�ugo is a great movie!

如您所见,输入字符串(ugo is a great movie!)的一部分已成功解密。这是常有的事吗?如果是,如何防止这种情况发生?还有其他算法比这更安全吗?如果没有,我的代码出了什么问题?

如果使用CBC,错误的IV只会阻止第一个块的解密,即AES情况下的前16个字节。这是故意的,不是弱点。

请参阅如果密钥已知,但IV未知,CBC密文是否可以解密?有关CBC如何治疗IV.

的详细信息

最新更新