@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加密代码有什么问题吗所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)