1

我正在测试此示例中的 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!. 它将lbMvxzBtu057yeNV5d/5MC7tlau7zfRXMtfLSUOBa7ueMGqRrm23H5uYGLmDcdJ3使用base64ed密钥gbpldgjBitwQXrQbbyHr+5J0cXADYAm+po8B29rYVJc=base64ed IV加密Ti7OcORScdXS/Ll7m1KdeQ==。(我将 base64ed 密钥和 IV 作为我的函数的输入,并在我的函数中对它们进行解码,如您在上面的代码中所见)

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

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

4

1 回答 1

5

如果使用 CBC,错误的 IV 只会阻止第一个块的解密,即 AES 的前 16 个字节。这是设计使然,而不是弱点。

请参阅Can CBC ciphertext are encrypted if the key is known, but the IV not? 有关 CBC 如何处理 IV 的详细信息。

于 2012-09-13T13:45:27.930 回答