c# - 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.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));
        }
    }

当通过具有英语(美国)区域设置的系统访问时,它工作正常。但是,一旦我在具有中文语言环境的系统中尝试它,它就会抛出以下错误:

Specified initialization vector (IV) does not match the block size for this algorithm.

Invalid character in a Base-64 string.

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

最佳答案

它似乎更像是一个字符串解码问题,而不是像 Rawling 这样的加密问题。说。感谢您指出这一点。

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

Encoding.GetEncoding(437);

https://msdn.microsoft.com/en-us/library/system.text.encoding(v=vs.110).aspx

再次感谢!

关于c# - AES 解密在中文语言环境中失败,出现无效字符错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31649469/

相关文章:

java - 加密大字节数组

mysql - 错误 1115 (42000) : Unknown character set: 'utf8mb4'

string - D 语言无法在 Windows 上显示德语元音变音?

c# - 在 C# 中加密解密 AES CBC 256

utf-8 - UTF-8 直接存储代码点的基本原理是什么?

c# - 更改 COM 类的 ProgID

c# - 将 C char[][] 数组编码到 C#

c# - 使用 TypeMock 模拟 Autofac 的 "Resolve"扩展方法

c# - 有没有更自动的方法来包装这些接口(interface)

java - 标准PBEByteEncryptor锁