AES通过无效的IV正确解密一半字符串,这是通常的吗?

Mah*_*asi 1 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 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;
    }
Run Code Online (Sandbox Code Playgroud)

这些都是我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!.

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

Cod*_*aos 5

如果使用CBC,则错误的IV仅阻止第一个块的解密,即AES的情况下的前16个字节.这是设计而不是弱点.

如果密钥已知,请参阅可以解密CBC密文,但IV不是吗?有关CBC如何处理IV的详细信息.

  • @MahdiGhiasi为什么你想要这个属性?IV不是秘密,它通常包含在您的密文中,因此攻击者知道IV.对于每种加密,IV的目的是不同的[并且在CBC的情况下是不可预测的],因此您可以实现[语义安全性](http://en.wikipedia.org/wiki/Semantic_security). (4认同)