2009-06-29 27 views
0

我在VB6中有一个解密例程。我现在想在C#中进行相同的解密。 需要解密的字符串是unicode,所以我使用Encoding.Unicode.GetString来读取C#中的输入。输入现在看起来与VB6中的完全相同。.Net unicode问题,vb6传统

循环中的前几个字符被解密了!然后我遇到一个差异... 程序解析字符'〜'的索引与VB6中的索引不同。

当调试我看到在VB和NET中执行以下操作:
VB6〜=码152
C#〜=代码732

不用说,解密失败。我需要为上面提到的角色获得152。

这里有什么问题?

问候,

米歇尔

回答

1

你VB6是不读书的Unicode(我猜在Windows的代码页1252),这就是为什么它回来了不同的字符代码。

+0

感谢您的回答,您是对的。 其实我忘了在C#中用codepage 1252读取解密种子。 – 2009-06-29 13:39:09

0

究竟是什么意思“字符152”?你是怎么得到这个数字的?

请注意,“在Unicode中”可能意味着许多不同的事情。你确定它在二进制数据中被编码为UTF-16吗?如果您可以发布更多关于源数据的信息,那将会非常有帮助。

此外,加密和解密应该几乎总是使用字节,而不是字符。虽然我知道您需要重现传统行为,但您应该尝试从一段时间内将字符串视为不透明的二进制数据。

+0

你是正确的,但我无法说服我的老板目前创建一个合理的系统。 (我在VB6中调试了152个) – 2009-06-29 13:54:51

0

我以前做过这个。问题在于你的编码。 .NET是unicode,VB6是Unifail。

在.NET方面,您需要使用Encoding.ASCII将字符串转换为字节数组,反之亦然。

Encoding.ASCII.GetString(decrypted); 
//and 
Encoding.ASCII.GetBytes(cleartext); 

所以,当你要加密发送到VB应用程序,您必须使用ASCII.GetBytes然后加密字节数组,当你从VB侧的字节数组,您必须对它们进行解密和使用ASCII.GetString将字节解码为可用的字符串。

+0

请问,这确实是我解决方案的一部分。但是,我使用Unicode而不是ASCII。我的密码和加密的文本不是64位的,甚至在ASCII 128位以下。 – 2009-06-29 13:51:38