2012-05-21 24 views
0

我需要使用已知的文本密鑰對.net應用程序中的文本字符串進行加密,然後使用相同的已知密鑰在Ruby中對其進行解密...但是,我無法制作這發生。我認爲它與字符串編碼問題有關。 .Net到Ruby RC4的例子已被證明是難以捉摸的。RC4在.net上用於在Ruby中解密

我在Ruby端收到並且無效的解密。加密/解密在.net實現上運行良好。但是,當我將加密值複製到Ruby實現並使用相同的密鑰時,我沒有得到我的原始值。

下面是我的.NET RC4實現(這並不需要安全的最高水平,但有些是好的):)

在Ruby方面我使用的紅寶石RC4 https://github.com/caiges/Ruby-RC4

 public string keytext = "thisismykey"; 
    public Form1() 
    { 
     InitializeComponent(); 
    } 
    public void RC4(ref Byte[] bytes, Byte[] key) 
    { 

     Byte[] s = new Byte[256]; 
     Byte[] k = new Byte[256]; 
     Byte temp; 
     int i, j; 

     for (i = 0; i < 256; i++) 
     { 
      s[i] = (Byte)i; 
      k[i] = key[i % key.GetLength(0)]; 
     } 

     j = 0; 
     for (i = 0; i < 256; i++) 
     { 
      j = (j + s[i] + k[i]) % 256; 
      temp = s[i]; 
      s[i] = s[j]; 
      s[j] = temp; 
     } 

     i = j = 0; 
     for (int x = 0; x < bytes.GetLength(0); x++) 
     { 
      i = (i + 1) % 256; 
      j = (j + s[i]) % 256; 
      temp = s[i]; 
      s[i] = s[j]; 
      s[j] = temp; 
      int t = (s[i] + s[j]) % 256; 
      bytes[x] ^= s[t]; 
     } 
    } 
    static byte[] GetBytes(string str) 
    { 
     Byte[] bytes = new byte[str.Length * sizeof(char)]; 
     System.Buffer.BlockCopy(str.ToCharArray(), 0, bytes, 0, bytes.Length); 
     return bytes; 
    } 
    static string GetString(byte[] bytes) 
    { 
     char[] chars = new char[bytes.Length/sizeof(char)]; 
     System.Buffer.BlockCopy(bytes, 0, chars, 0, bytes.Length); 
     return new string(chars); 
    } 
    private void button1_Click(object sender, EventArgs e) 
    { 
     Byte[] content = Encoding.ASCII.GetBytes(textBox1.Text); 
     RC4(ref content, Encoding.ASCII.GetBytes(keytext)); 
     textBox2.Text = Encoding.ASCII.GetString(content); 
     RC4(ref content, Encoding.ASCII.GetBytes(keytext)); 
     label1.Text = Encoding.ASCII.GetString(content); 
    } 
+0

你能否詳細說明你有什麼麻煩?錯誤消息?無效的結果? – PinnyM

+0

已更新的問題:我正在接收並在Ruby端無效解密。加密/解密在.net實現上運行良好。但是,當我將加密值複製到Ruby實現並使用相同的密鑰時,我沒有得到我的原始值。 – Webjedi

+0

你用什麼將.net中的散列轉換爲ruby?有沒有什麼特定的編碼您在ruby的最終使用(UTF-8而不是ASCII)? – PinnyM

回答

0

由於ASCII編碼爲7位,並且在重新創建127以上的字符時遇到問題,因此可能會出現此問題。嘗試使用UTF-8編碼或將字節數組轉換爲Base64字符串。