我在c ++中有一个加密例程,我把它翻译成C#:
示例:
public void main()
{
string myPwd = "ÖFÖæ6";
string pwdCoded = XEncrypt.EncryptData_Patch_x_Net(myPwd);
//Result OK: ÖFÖæ–6
}
public static string EncryptData_Patch_x_Net(string Data)
{
byte[] bytes = new byte[Data.Length];
for (int n = 0; n < Data.Length; n++)
{
bytes[n] = (byte)Data[n];
}
System.Text.Encoding MyEncoding = System.Text.Encoding.Default;
String MyResult = MyEncoding.GetString(bytes);
return MyResult;
}
我需要制作反转例程,使其转换为:
ÖFÖæ–6
到 ÖFÖæ6
(请注意左侧字符串中有短划线)
我做了最后一个功能,但错误地执行了编码
public static string DecryptData_Patch_x_Net(string Data)
{
byte[] bytes = new byte[Data.Length];
for (int n = 0; n < Data.Length; n++)
{
bytes[n] = (byte)Data[n];
}
System.Text.Encoding MyEncoding = System.Text.Encoding.GetEncoding(1252);
String MyResult = MyEncoding.GetString(bytes);
return MyResult;
}
答案 0 :(得分:5)
这不是加密,你真的很复杂。
Encoding iso88591 = Encoding.GetEncoding(28591);
Encoding w1252 = Encoding.GetEncoding(1252);
//
string pwd = "ÖFÖæ\u00966"; //The SPA control character will not survice a Stackoverflow post
//So I use \u0096 to represent it
string result = w1252.GetString(iso88591.GetBytes(pwd)); //"ÖFÖæ–6"
string original = iso88591.GetString(w1252.GetBytes(result)); //"ÖFÖæ6" with the hidden control character before 6
Console.WriteLine(result == "ÖFÖæ–6"); //True
Console.WriteLine(original == "ÖFÖæ\u00966"); //True
答案 1 :(得分:1)
您的错误名称...Encrypt...
功能会产生根本性错误。您将string
视为char[]
(很好),然后将每个char
明确地投放到byte
。这是一个缩小的转换。你将失去任何高位和往返更奇怪char
的能力。如果你看一下this question,应该有助于理解。
您可以使用此函数获取字节而不会丢失信息,
static byte[] GetBytes(string str)
{
byte[] bytes = new byte[str.Length * sizeof(char)];
System.Buffer.BlockCopy(str.ToCharArray(), 0, bytes, 0, bytes.Length);
return bytes;
}
字节数组将在共享endianess的系统上往返。
正如Esailija所说的那样,因为它简单而且会明确地返回小端结果,你最好不要打电话
byte[] Encoding.Unicode.GetBytes(string)