【问题标题】:Rijandeal and special charactersRijandeal 和特殊字符
【发布时间】:2019-09-05 02:49:58
【问题描述】:

我正在使用 Rijandeal 进行编码/解码。我注意到一些特殊字符没有得到正确管理。

代码如下:

    static void Main(string[] args)
    {        
        string enc = RijanENC("šđčćž");
        string dec = RijanDEC(enc);

        Console.WriteLine(dec);
        Console.ReadKey();
    }

    private static string RijanENC(string texto_puro)
    {
        byte[] key = System.Text.Encoding.Default.GetBytes("123abc12");
        byte[] iv = System.Text.Encoding.Default.GetBytes("0123456789abcdef");
        byte[] stringToEncrypt = System.Text.Encoding.UTF32.GetBytes(texto_puro);


        Rijndael rjnAlg = Rijndael.Create();
        System.IO.MemoryStream ms = new MemoryStream();
        CryptoStream cs = new CryptoStream(ms, rjnAlg.CreateEncryptor(key, iv), CryptoStreamMode.Write);
        cs.Write(stringToEncrypt, 0, stringToEncrypt.Length);
        cs.FlushFinalBlock();
        return Convert.ToBase64String(ms.ToArray());
    }

    private static string RijanDEC(string texto_encriptado)
    {
        byte[] key = System.Text.Encoding.Default.GetBytes("123abc12");
        byte[] iv = System.Text.Encoding.Default.GetBytes("0123456789abcdef");
        byte[] stringToDecrypt = new byte[texto_encriptado.Length];


        Rijndael rjnAlg = Rijndael.Create();
        MemoryStream ms = new MemoryStream();
        CryptoStream cs = new CryptoStream(ms, rjnAlg.CreateDecryptor(key, iv), CryptoStreamMode.Write);
        stringToDecrypt = Convert.FromBase64String(texto_encriptado);
        cs.Write(stringToDecrypt, 0, stringToDecrypt.Length);
        cs.FlushFinalBlock();

        Encoding encoding = Encoding.UTF32;
        return encoding.GetString(ms.ToArray());
    }

所以我要编码的文本。包含一些变音符号šđčćž。解码后,即使使用 UTF32,我也会得到 sdccz。

【问题讨论】:

  • 没有特殊字符,你刚才写的问题证明了这一点。 .NET 对字符串使用 UTF16。默认情况下,ASP.NET 以 UTF8 呈现页面。 SO 使用 ASP.NET 并将文本存储在 nvarchar 字段中。这就是为什么你能够在你的问题中写出这些字符。事实上,这些字符可能是拉丁 1 代码页的一部分,在西欧甚至不需要 Unicode,更不用说 UTF32
  • 为什么你认为文字有问题?您尝试了什么,输出是什么,您期望什么?您是否尝试比较输出而不是打印输出?
  • 好点@PanagiotisKanavos - 比较它们会是更好的方法
  • 我在这段代码中看到的一个问题是System.Text.Encoding.Default.GetBytes。这将使用当前语言环境的代码页,该代码页破坏不在该代码页中的任何字符。
  • 停止使用 Rijndael,它不是标准的旧库。

标签: c# encryption diacritics rijndael


【解决方案1】:

加密/解密代码按预期工作,控制台输出是问题。

设置 outputEncoding 以正确编码显示字符

Console.OutputEncoding = System.Text.Encoding.UTF8;
Console.WriteLine(dec);
Console.ReadKey();

【讨论】:

  • 对于他发布的 sn-p,输出被写入控制台,问题是编码,对于其他输出,我认为问题是相同的。
  • 非常感谢。就是这个。但我有点困惑,因为 ç、á、é、â、ü、ö、ä、ß 等字符在没有定义 OutputEncoding 的情况下正确显示在控制台上。只有我最初测试的那些字符不是。无论如何,谢谢!
  • 这些字符存在于默认编码的字符映射中(IBM437IBM850),而您最初发布的其他字符则不存在。
猜你喜欢
  • 2015-07-10
  • 2012-09-24
  • 2011-05-17
  • 2016-12-08
  • 2011-05-03
  • 2017-02-27
  • 2011-09-28
  • 1970-01-01
相关资源
最近更新 更多