VS 2005 C# 中如何将 VB6 的 RC4 算法重写一遍,我重写了,运行正常没出错,但是结果不对,是乱码,请高手“纠正”
具体的代码在以下地址可以下载:
http://access911.net/csdn/filedescription.asp?mdb=2006-6-26&id=22&mode=3
VS 2005 C# 中如何将 VB6 的 RC4 算法重写一遍,我重写了,运行正常没出错,但是结果不对,是乱码,请高手“纠正”。注意!是纠正,不是从其他地方抄一篇给我,因为我是要学 C# ,要知道我到底错在哪里并且到底应该如何修改才正确!
RC4 算法从 VB6 转到 C# VS.NET 2005 运行没问题,但是结果不对,请问如何修正?
public static void RunTest()
{
MessageBox.Show("DeEncrypt:" + DeEncrypt.RC4 (DeEncrypt.RC4 ("Iknhbg","a") ,"a") );
}
/*
* 如何将以下 VB6 的 RC4 编码改为 VS.NET 2005 C# 的方法?
* 我重写了一个方法,可以运行,但是结果是乱码,如何更正,请告知我到底错在哪里
* 我不是要一个可以用的 RC4 算法,而是要各位高手帮我看一下我的代码错在哪里?
*
Private Function RC4(ByVal inp As String, _
key As String) As String
Dim s(0 To 255) As Byte, k(0 To 255) As Byte, i As Long
Dim j As Long, temp As Byte, y As Byte, t As Long, x As Long
Dim Outp As String
For i = 0 To 255
s(i) = i
Next
j = 1
For i = 0 To 255
If j > LenB(key) Then
j = 1
End If
k(i) = AscB(MidB(key, j, 1))
j = j + 1
Next i
j = 0
For i = 0 To 255
j = (j + s(i) + k(i)) Mod 256
temp = s(i)
s(i) = s(j)
s(j) = temp
Next i
i = 0
j = 0
For x = 1 To LenB(inp)
i = (i + 1) Mod 256
j = (j + s(i)) Mod 256
temp = s(i)
s(i) = s(j)
s(j) = temp
t = (s(i) + (s(j) Mod 256)) Mod 256
y = s(t)
Outp = Outp & ChrB(AscB(MidB(inp, x, 1)) Xor y)
Next
RC4 = Outp
End Function
大家注意,上面这段是注释中的内容,是 VB6 的代码,不是 C# 的!
*/
public static char Chr(int CharCode)
{
//return Convert.ToChar(CharCode);
byte[] bytes = new byte[1];
bytes[0] = (byte)CharCode;
return Encoding.GetEncoding("GB2312").GetString(bytes)[0];
}
public static int Asc(string CharWord)
{
//return (int)Encoding.ASCII.GetBytes(CharWord)[0];
return (int)Encoding.GetEncoding("GB2312").GetBytes(CharWord)[0];
}
public static string RC4(string Words, string key)
{
byte[] S = new byte[256];
byte[] K = new byte[256];
long i1;
long j;
byte temp;
byte Y;
long t;
//long x;
string OutP="";
for (int i = 0; i < 256; i++)
{
S = (byte)(i);
}
j = 1;
for (int i = 0; i < 256; i++)
{
if (j > key.Length)
{
j = 1;
}
K =(byte)(Asc(key.Substring((int)(j-1), 1)));
j++;
}
j = 0;
for (int i = 0; i < 256; i++)
{
j = (j + S + K) % 256;
temp = S;
S = S[j];
S[j] = temp;
}
i1 = 0;
j = 0;
for (int x = 1; x <= Words.Length; x++)
{
i1 = (i1 + 1) % 256;
j = (j + S[i1]) % 256;
temp = S[i1];
S[i1] = S[j];
S[j] = temp;
t = (S[i1] + (S[j] % 256)) % 256;
Y = S[t];
OutP += Chr((int)((byte)(Asc(Words.Substring(x-1, 1))) ^ Y)) ;
}
return OutP;
}
}
------------------------
以下是我摘抄其他网站的代码,但是结果也是错误的
http://www.codeproject.com/cs/algorithms/rc4csharp.asp
大家看一下,这个 RC4 C# .NET 1.1 的程序应该是用得比较广泛了。但是我用
输入值:"adddddd"
密钥:"c"
加密,然后再解密回来就少了一个 d ,结果不对了。
我是直接运行那个 DEMO 的 EXE 文件的,大家看看是否代码有问题
运行环境跟大家说一下:
WINDOWS 2003 简体中文企业版 SP1
VS.NET 2005 简体中文标准版
我现在的应用是这样的: 客户有两个 VB DELPHI 的 SERVICE ,他们都通过一个 XML 来读取运行时需要的参数,但是这些参数都是用 RC4 加密的
因此,如果我要用 VS.NET C#来写一个新的功能也必须能够使用RC4 ,
否则就无法获取参数。
实在不行也我也可以用VB 写一个RC4 COM+ ,然后在 C#调用,不过既然学了 C# ,趁机就多学一点经验。所以这个问题还是要解决的。