2014-02-26 55 views
0

我有以下方法需要純文本和關鍵文本。它應該返回一個使用XOR方法加密的字符串ascii。XOR密碼是否有任何規則?

public static string encryptXOREng(string plainText,string keyText) 
     { 
      StringBuilder chiffreText = new StringBuilder(); 

      byte[] binaryPlainText = System.Text.Encoding.ASCII.GetBytes(plainText); 

      byte[] binaryKeyText = System.Text.Encoding.ASCII.GetBytes(keyText); 


      for(int i = 0;i<plainText.Length;i++) 
      { 
       int result = binaryPlainText[i]^binaryKeyText[i]; 
       chiffreText.Append(Convert.ToChar(result)); 
      } 

      return chiffreText.ToString(); 
     } 

對於一些字符,它運行得很好。但是,例如,如果它在'G'&'M'上執行XOR,這是71 XOR 77,它返回10.並且10代表換行。然後,這實際上不是由我的輸出中的字符表示的。這導致長度的純文本被加密爲只有2個字符長的密碼串,在某些情況下。我想這會使解密變得不可能,即使是一個密鑰?或者是那裏的ascii字符0 - 31,但根本不可見?

回答

3

爲了避免非打印字符使用Convert.ToBase64String

public static string encryptXOREng(string plainText, string keyText) 
{ 
    List<byte> chiffreText = new List<byte>();  

    byte[] binaryPlainText = System.Text.Encoding.ASCII.GetBytes(plainText); 

    byte[] binaryKeyText = System.Text.Encoding.ASCII.GetBytes(keyText); 


    for (int i = 0; i < plainText.Length; i++) 
    { 
     int result = binaryPlainText[i]^binaryKeyText[i % binaryKeyText.Length]; 
     chiffreText.Add((byte)result); 
    } 

    return Convert.ToBase64String(chiffreText.ToArray()); 
} 

PS:在你的代碼假設keyText不超過plainText短,我固定它也。

+0

我知道,這只是一個示例,我也調整了一個調整鍵的方法。 –

+0

也轉換爲Base64會限制輸出字符的範圍,不是嗎? –

+1

@bodycountPP是的,它將包含* 64 *不同(可打印)字符:) –

1

據我所知沒有特定於xor-ciphers的規則。密碼功能經常輸出不可打印的值,這是合理的 - 結果不應該是可讀的。相反,您可能希望直接使用輸出字節或base64編碼結果。

我會做這樣的事情:

public static byte[] XORCipher(string plainText, string keyText) 
{ 
    byte[] binaryPlainText = System.Text.Encoding.ASCII.GetBytes(plainText); 
    byte[] binaryKeyText = System.Text.Encoding.ASCII.GetBytes(keyText); 

    for(int i = 0;i<plainText.Length;i++) 
    { 
     binaryPlainText[i] ^= binaryKeyText[i]; 
    } 
    return binaryPlainText; 
} 
+0

這是有道理的方法不應該返回一個可讀的密碼,而是一個整數數組? –

+1

@bodycountPP,更新答案與執行 –