【发布时间】: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