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

本文关键字:什么 问题 代码 中的 RC4 加密 | 更新日期: 2023-09-27 18:06:45

我正在尝试在c#中收听Foxycart XML Datafeed,并遇到一个归结为加密的问题。

简而言之,它们使用RC4加密将数据作为编码和加密的XML发送过来。

为了测试,他们有一些(用户提交的)示例代码用c#进行测试。我尝试使用这个由一个用户提供的示例RC4解密代码,但它似乎不起作用,他们的支持人员认为它与c# RC4算法有关。因为他们不是c#专家,我想我应该在这里问一下。这是FoxyCart论坛上的帖子

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

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;
}

,这里是接收响应的回调方法

[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类内联出来,而是提供了这个RC4类代码的链接。

正如我在问题顶部的上面链接中所发布的那样,问题是当我检查

内部的变量事务时
 RecieveDataFeed()

方法,我应该有常规的XML返回,但我看到这个:

É?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!‚.e8s
Gyª4¼ò,}Yœ‚¹”±E‡Jy}Sæ
ƒ¦ýK'Ð}~B¦E3!0°ú´A–5Þ³£9$–8äÏ©?
 œ‡8GÂø

代码看起来是正确的:

  1. 解密

但它似乎不起作用。有什么建议上面可能是错的吗?

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

我对CR4类中的代码感到有点惊讶。我看不出它怎么能可靠地工作。

代码使用windows-1252编码将字符编码为字节,然后对字节进行加密,并尝试将字节解码为字符。这将不可靠地工作,因为您只能解码来自编码字符的字节。

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

下面是这样的一个版本:

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);
  }
}

的例子:

string data = "This is a test.";
byte[] key = { 1, 2, 3, 4, 5 };
// encrypt
byte[] enc = RC4.Encrypt(key, Encoding.UTF8.GetBytes(data));
// turn into base64 for convenient transport as form data
string base64 = Convert.ToBase64String(enc);
Console.WriteLine(base64);
// turn back into byte array
byte[] code = Convert.FromBase64String(base64);
// decrypt
string dec = Encoding.UTF8.GetString(RC4.Decrypt(key, code));
Console.WriteLine(dec);
输出:

5lEKdtBUswet4yYveWU2
This is a test.

虽然这是在黑暗中拍摄…我很确定实现RC4的类看起来就像假设一切都是ASCII或CodePage 1252 -两者都是错误的,因为我假设提供的XML是UTF-8和。net字符串表示在内存中是UTF16…

如果我的假设是正确的,当你从加密中得到它时,数据已经被打乱了…



  • http://tofuculture.com/Blog/post/RC4-Encryption-in-C.aspx
  • http://dotnet-snippets.com/dns/rc4-encryption-SID577.aspx
  • http://www.codeproject.com/KB/recipes/rc4csharp.aspx
  • http://icodesnip.com/snippet/csharp/rc4-encryption-code-snippets