VS 2005 C# 中如何将 VB6 的 RC4 算法重写一遍,我重写了,运行正常没出错,但是结果不对,是乱码,请高手“纠正”

changechange 2006-06-26 03:57:59
具体的代码在以下地址可以下载:
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# ,趁机就多学一点经验。所以这个问题还是要解决的。

...全文
483 33 打赏 收藏 转发到动态 举报
写回复
用AI写文章
33 条回复
切换为时间正序
请发表友善的回复…
发表回复
SaSBYa 2006-07-17
  • 打赏
  • 举报
回复
qu see 1 see
changechange 2006-07-02
  • 打赏
  • 举报
回复
mooniscrazy(月色疯狂)

请问在 C# .NET 2005 中哪里内置了 RC4 算法?请列出具体调用方法,我可以另开帖子给分!


changechange 2006-07-02
  • 打赏
  • 举报
回复
RC4 的问题解决

http://community.csdn.net/Expert/topic/4855/4855818.xml?temp=.8912775

请去领分
changechange 2006-07-02
  • 打赏
  • 举报
回复
System.Security.Cryptography 中只有 RC2 类,没有 RC4 ,请问楼上如何实现 RC4 加密解密
Knight94 2006-06-30
  • 打赏
  • 举报
回复
to http://www.codeproject.com/cs/algorithms/rc4csharp.asp
-----在我的提问一开始就已经明确说明了,上述算法是错误得!它自己的 DEMO 都不能还原它用RC4 加密的数据,不攻自破!

这个代码是有些问题,稍作修改后就可以了,你把RC4Engine.cs文件中的RC4Engine类的Encrypt函数中把
Encoding enc_default = Encoding.Default;
改为
Encoding enc_default = Encoding.Unicode;
即可实现。
mooniscrazy 2006-06-30
  • 打赏
  • 举报
回复
写什么呀。.net 2.0有rc4算法的实现。直接用就完事了。
Knight94 2006-06-30
  • 打赏
  • 举报
回复
sorry!

忘说了一个地方,你把RC4Engine.cs文件中的RC4Engine类的Encrypt函数中把
char[] outarrchar = new char[enc_default.GetCharCount(output,0,output.Length)];
enc_default.GetChars(output,0,output.Length,outarrchar,0);
this.m_sCryptedText = new string (outarrchar);

改为
this.m_sCryptedText = enc_default.GetString( output );
Knight94 2006-06-30
  • 打赏
  • 举报
回复
我试过,没有问题,要不然我也不告诉你这个解决方法。
不过我的是vs2003而已
changechange 2006-06-30
  • 打赏
  • 举报
回复
按楼上的做法,治标不治本

以下是我摘抄其他网站的代码,并且按照 Knight94(愚翁) 的指导将
Encoding enc_default = Encoding.Default;
改为
Encoding enc_default = Encoding.Unicode;

但是结果也是错误的
http://www.codeproject.com/cs/algorithms/rc4csharp.asp

大家看一下,这个 RC4 C# .NET 1.1 的程序应该是用得比较广泛了。但是我用
输入值:"中国"
密钥:"c c 1 "
加密,然后再解密回来就是乱码 ,结果不对了。

运行环境跟大家说一下:

WINDOWS 2003 简体中文企业版 SP1
VS.NET 2005 简体中文标准版
Knight94 2006-06-29
  • 打赏
  • 举报
回复
reference:
http://www.codeproject.com/cs/algorithms/rc4csharp.asp
changechange 2006-06-29
  • 打赏
  • 举报
回复
Function test()
Debug.Print AscB("c")
Debug.Print AscB("ccc")
Debug.Print AscB("中国")
Debug.Print LenB("c")
Debug.Print LenB("中国")
Debug.Print AscB(MidB("中", 1, 1))
Debug.Print AscB(MidB("中", 2, 1))
Debug.Print AscB(MidB("c", 1, 1))
Debug.Print AscB(MidB("c", 2, 1))
Debug.Print MidB("c", 2, 1) = ""
Debug.Print MidB("c", 1, 1) = "c"

' 上述代码的测试结果如下:
'99
'99
'45
'2
'4
'45
'78
'99
'0
'True
'False

'如何能实现他们的 C# .NET 2005 版本?

End Function

我要实现上述代码,你们提供的都不满足

最终我要实现正确的 RC4 ,你们提供的代码也不能实现
addwing 2006-06-29
  • 打赏
  • 举报
回复
关注。学习。帮你顶。。。。。。。。。。
changechange 2006-06-29
  • 打赏
  • 举报
回复
http://www.codeproject.com/cs/algorithms/rc4csharp.asp
-----在我的提问一开始就已经明确说明了,上述算法是错误得!它自己的 DEMO 都不能还原它用RC4 加密的数据,不攻自破!


以下是我摘抄其他网站的代码,但是结果也是错误的
http://www.codeproject.com/cs/algorithms/rc4csharp.asp

大家看一下,这个 RC4 C# .NET 1.1 的程序应该是用得比较广泛了。但是我用
输入值:"adddddd"
密钥:"c"
加密,然后再解密回来就少了一个 d ,结果不对了。

我是直接运行那个 DEMO 的 EXE 文件的,大家看看是否代码有问题

运行环境跟大家说一下:

WINDOWS 2003 简体中文企业版 SP1
VS.NET 2005 简体中文标准版

addwing 2006-06-28
  • 打赏
  • 举报
回复
关注。。。学习。。。帮你顶。。。
copall 2006-06-28
  • 打赏
  • 举报
回复
public static int LenB(string CharWords)
{
return (int)Encoding.Unicode.GetByteCount(Encoding.Unicode.GetBytes(CharWords));
}
Knight94 2006-06-28
  • 打赏
  • 举报
回复
如果Start是从0开始,可以如下:
public static string MidB(string CharWords, int Start, int ByteSize)
{
byte[] bytes = Encoding.Unicode.GetBytes(CharWords);
Debug.Print(CharWords + "的字节数为:" + bytes.GetLength(0).ToString());
if (ByteSize == 0)
{
return Encoding.Unicode.GetString(bytes, Start, bytes.Length - Start );
}
else
{
return Encoding.Unicode.GetString(bytes, Start, ByteSize);
}

}
Knight94 2006-06-28
  • 打赏
  • 举报
回复
public static string ChrB(int CharCode)
{
byte[] bytes = new byte[1];
bytes[0] = (byte)CharCode;
return Encoding.Default.GetString(bytes);
}
Knight94 2006-06-28
  • 打赏
  • 举报
回复
public static int AscB(string CharWord)
{
return Encoding.Unicode.GetBytes(CharWord)[0];
}
changechange 2006-06-28
  • 打赏
  • 举报
回复
至于其他操作,你可以都先转换成byte,然后进行操作,例如:
string strValue = "c";
byte[] bData = Encoding.Unicode.GetBytes( strValue );
//do something with "bData"

---------------能否把具体实现写出来。笼统的说的我都写过代码了,都是错误的!
以下是我写的代码,但是都有问题,测试结果与 VB6 的不同


public static int LenB(string CharWords)
{
//LenB("c")=1
//return Encoding.Default.GetBytes(CharWords).Length;

//vb6 中 LenB("c") 是2,所以这里也要改为 Unicode
//return Encoding.Unicode.GetBytes(CharWords).Length;

// 第三种方法
return (int)Encoding.Unicode.GetByteCount(CharWords);
}
public static int AscB(string CharWord)
{
//int bytes = Encoding.Unicode.GetByteCount(CharWord); //调试时使用
if (CharWord == "")
{
return 0;
}
else
{
return (int)Encoding.Unicode.GetBytes(CharWord)[0];
}
}
public static string ChrB(int CharCode)
{
byte[] bytes = new byte[1];
bytes[0] = (byte)CharCode;
return Encoding.Default.GetString(bytes)[0].ToString();
}

#region MidB

public static string MidB(string CharWords, int Start)
{
return MidB(CharWords, Start, 0);
}

public static string MidB(string CharWords, int Start, int ByteSize)
{

//byte[] bytes = Encoding.GetEncoding("GB2312").GetBytes(CharWords);
byte[] bytes = Encoding.Unicode.GetBytes(CharWords);
Debug.Print(CharWords + "的字节数为:" + bytes.GetLength(0).ToString());
if (ByteSize == 0)
{
return Encoding.Unicode.GetString(bytes, Start - 1, bytes.Length - Start + 1);
}
else
{
return Encoding.Unicode.GetString(bytes, Start - 1, ByteSize);
}

}

#endregion
Knight94 2006-06-28
  • 打赏
  • 举报
回复
至于其他操作,你可以都先转换成byte,然后进行操作,例如:
string strValue = "c";
byte[] bData = Encoding.Unicode.GetBytes( strValue );
//do something with "bData"
加载更多回复(13)

111,120

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧