Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/338.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解密在中文区域设置中失败,出现无效字符错误_C#_Encryption_Character Encoding_Aes - Fatal编程技术网

C# AES解密在中文区域设置中失败,出现无效字符错误

C# AES解密在中文区域设置中失败,出现无效字符错误,c#,encryption,character-encoding,aes,C#,Encryption,Character Encoding,Aes,我有以下代码: private static string AesDecrypt(string text, string key) { var encoding = Encoding.Default; var aes = new RijndaelManaged { KeySize = 256, BlockSize = 256, Padding = PaddingMode

我有以下代码:

private static string AesDecrypt(string text, string key)
    {
        var encoding = Encoding.Default;
        var aes = new RijndaelManaged
        {
            KeySize = 256,
            BlockSize = 256,
            Padding = PaddingMode.Zeros,
            Mode = CipherMode.CBC,
            Key = encoding.GetBytes(key)
        };

        text = encoding.GetString(Convert.FromBase64String(text));

        var iv = text;
        iv = iv.Substring(iv.IndexOf("-[--IV-[-", StringComparison.Ordinal) + 9);
        text = text.Replace("-[--IV-[-" + iv, "");

        text = Convert.ToBase64String(encoding.GetBytes(text));
        aes.IV = encoding.GetBytes(iv);

        using (var aesDecrypt = aes.CreateDecryptor(aes.Key, aes.IV))
        {
            var buffer = Convert.FromBase64String(text);

            var result = encoding.GetString(aesDecrypt.TransformFinalBlock(buffer, 0, buffer.Length));
            result = result.Substring(0, result.IndexOf(Convert.ToChar(0)));

            return result;
        }
    }

    private static string AesEncrypt(string text, string key)
    {
        var encoding = Encoding.Default;
        var aes = new RijndaelManaged
        {
            KeySize = 256,
            BlockSize = 256,
            Padding = PaddingMode.Zeros,
            Mode = CipherMode.CBC,
            Key = (encoding.GetBytes(key))
        };

        aes.GenerateIV();
        var iv = ("-[--IV-[-" + encoding.GetString(aes.IV));

        using (var aesEncrypt = aes.CreateEncryptor(aes.Key, aes.IV))
        {
            var buffer = encoding.GetBytes(text);

            return Convert.ToBase64String(encoding.GetBytes(encoding.GetString(aesEncrypt.TransformFinalBlock(buffer, 0, buffer.Length)) + iv));
        }
    }
当通过英语(美国)语言环境的系统访问时,它可以正常工作。但是,一旦我在中文区域设置的系统中尝试,它会抛出以下错误:

指定的初始化向量(IV)与的块大小不匹配 这个算法

Base-64字符串中的字符无效


一些消息来源说我应该使用Encoding.UTF8或Encoding.Unicode来解决这个问题。我试过了,但还是出现了同样的错误。

看起来这更像是一个字符串解码问题,而不是像赛义德所说的加密问题。谢谢你指出这一点

无论如何,我没有使用Encoding.Default、Encoding.UTF或Encoding.Unicode,而是尝试使用基于美国的编码(OEM美国),解决了我的问题:

Encoding.GetEncoding(437);


再次感谢

您是使用中文区域设置和拉丁字符,还是使用中文区域设置和字符?加密的数据都是字母数字字符。(A-Z和0-9)它在英语区域设置系统上运行良好,没有任何错误,但在中文区域设置系统中测试时出现错误。我认为这更多的是字符串解码问题,而不是加密或AES问题。