C#中的RC4加密代码有什么问题吗

C#中的RC4加密代码有什么问题吗,第1张

概述我试图在C#中收听 Foxycart XML Datafeed并遇到一个归结为加密的问题. 简而言之,他们使用RC4 encryption将数据作为编码和加密的XML发送. 为了测试,他们有some (user submitted) sample code to test this with C#.我尝试使用其中一个用户提供的这个示例RC4解密代码,但它似乎不起作用,他们的支持人员认为它使用C#R 我试图在C#中收听 Foxycart XML Datafeed并遇到一个归结为加密的问题.

@H_403_8@

简而言之,他们使用RC4 encryption将数据作为编码和加密的XML发送.@H_403_8@

为了测试,他们有some (user submitted) sample code to test this with C#.我尝试使用其中一个用户提供的这个示例RC4解密代码,但它似乎不起作用,他们的支持人员认为它使用C#RC4算法.由于他们不是C#专家,我想我会问这里.这是the post on the FoxyCart forum@H_403_8@

无论如何,这里是(试图)通过加密XML文件并将其发布到URL来模拟响应的代码(注意,datafeedKey是我已存储为成员变量的字符串):@H_403_8@

@H_403_8@

public ActionResult Testdatafeed(){    string transactionData = (new StreamReader(@"D:\SampleFeed.xml")).ReadToEnd();    string encryptedTransactionData = RC4.Encrypt(datafeedKey,transactionData,false);    string encodedTransactionData = httpUtility.UrlEncode(encryptedTransactionData,EnCoding.GetEnCoding(1252));    string postData = "FoxyData=" + encodedTransactionData;    var req = (httpWebRequest)WebRequest.Create("http://localhost:3396/FoxyCart/RecIEvedatafeed");    req.Method = "POST";    req.ContentType = "application/x-www-form-urlencoded";    var sw = new StreamWriter(req.GetRequestStream(),EnCoding.ASCII);    sw.Write(postData);    sw.Close();    httpWebResponse resp = null;    try    {        resp = (httpWebResponse)req.GetResponse();        string r = new StreamReader(resp.GetResponseStream()).ReadToEnd();    }    catch (WebException ex)    {        string err = new StreamReader(ex.Response.GetResponseStream()).ReadToEnd();    }    return null;}

这是接收响应的回调方法.@H_403_8@

@H_403_8@

[ValIDateinput(false)]public ActionResult RecIEvedatafeed(FormCollection collection){    string unencodedFeed = httpUtility.UrlDecode(collection["FoxyData"],EnCoding.GetEnCoding(1252));    string transaction = RC4.Decrypt(datafeedKey,unencodedFeed,false);    return Content("foxy");}

而不是在这个问题中内联整个RC4类,here is a link to the code of this RC4 class.@H_403_8@

正如我在问题顶部的上述链接中发布的那样,问题是当我检查内部的变量事务时@H_403_8@

@H_403_8@

RecIEvedatafeed()

方法,我应该有常规XML回来,但我看到这个:@H_403_8@

@H_403_8@

É?xø´ v´“Û·8êUŸí¥MïSÅJÖó5Cå7ã…ÄlÞ&þòG·¶ÝÙ3<ÍÖ¡«úüF¿¿ßìNµ>4¦Äu÷¼Â;£-w¤ƒûÊyL¹®½èíYö½’é(µJŒ~»»=3¼]F‡•=±Ùí]'鳫"øPç{Ù^yyéå–°ñ…5ðWF$zÉnÄ^_”Xë’ï%œ-5áÒÛ€jŠt`Â9œÇÞLU&¼~ç2îžúo/¢¶5,º*öOqÝ—‘.ó®šuf™å5G—õC®‰ÁéiÇúW®¦ÝÚ•Z±:„Q\p"pôÔiÛ!\D"ÉÂX3]ƒ°è€Œ«DQE‡kÝ@àö`gpöŽ÷nÛ={µÏßKQKüå(ö%¯¯Ü–9}¨¬°£7yo,«”ÜëCÍ/+…†ÕËî‘‹‰AÚmÇÙå©&©¡xÙkŒföX¯ÃX&×°S|kÜ6Ô°Üú\Ätóü-äUƆÈáÅ\ ’E8‚¤âÈ4Ž¾«ãΚ_Sï£y‰xJº•bm*jo›‰ÜW–[ô†ÆJÐà$½…9½šžˆ_ÙÜù/®öÁVhzŠ¥ú(ñ£²6ˆb6¢ëße¤oáIðZuK}ÆÙ]"T¼*åZêñß5K—½òQSåRN Çë'šÕyiÈX •bØðIk¿WxwNàäx®‹?cv+X™¥E!gd4â¤nÔ‹¢½Ð”ªÊ­Q!‚.e8sGyª4¼ò,}Yœ‚¹”±E‡Jy}S惦ýK'Ð}~B¦E3!0°ú´A–5Þ³£9$–8äÏ©? œ‡8GÂø

代码看起来正确:@H_403_8@

>加密
>编码
>解码
>解密@H_403_8@

但它似乎没有起作用.关于上面可能出错的任何建议?@H_403_8@解决方法 我对CR4类中的代码感到有些惊讶.我看不出它如何可靠地工作.

@H_403_8@

代码使用windows-1252编码将字符编码为字节,然后加密字节并尝试将字节解码为字符.这将无法可靠地工作,因为您只能解码来自编码字符的字节.@H_403_8@

该方法接受一个字符串并返回一个字符串,但它应该采用一个字节数组并返回一个字节数组,类似于框架中所有加密类的 *** 作方式.@H_403_8@

这是一个像这样的版本:@H_403_8@

@H_403_8@

public class RC4 {  public static byte[] Encrypt(byte[] pwd,byte[] data) {    int a,i,j,k,tmp;    int[] key,Box;    byte[] cipher;    key = new int[256];    Box = new int[256];    cipher = new byte[data.Length];    for (i = 0; i < 256; i++) {      key[i] = pwd[i % pwd.Length];      Box[i] = i;    }    for (j = i = 0; i < 256; i++) {      j = (j + Box[i] + key[i]) % 256;      tmp = Box[i];      Box[i] = Box[j];      Box[j] = tmp;    }    for (a = j = i = 0; i < data.Length; i++) {      a++;      a %= 256;      j += Box[a];      j %= 256;      tmp = Box[a];      Box[a] = Box[j];      Box[j] = tmp;      k = Box[((Box[a] + Box[j]) % 256)];      cipher[i] = (byte)(data[i] ^ k);    }    return cipher;  }  public static byte[] Decrypt(byte[] pwd,byte[] data) {    return Encrypt(pwd,data);  }}

例:@H_403_8@

@H_403_8@

string data = "This is a test.";byte[] key = { 1,2,3,4,5 };// encryptbyte[] enc = RC4.Encrypt(key,EnCoding.UTF8.GetBytes(data));// turn into base64 for convenIEnt transport as form datastring base64 = Convert.ToBase64String(enc);Console.Writeline(base64);// turn back into byte arraybyte[] code = Convert.FromBase64String(base64);// decryptstring dec = EnCoding.UTF8.GetString(RC4.Decrypt(key,code));Console.Writeline(dec);

输出:@H_403_8@

@H_403_8@

5lEKdtBUswet4yYveWU2This is a test.
总结

以上是内存溢出为你收集整理的C#中的RC4加密代码有什么问题吗全部内容,希望文章能够帮你解决C#中的RC4加密代码有什么问题吗所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1223206.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存