XOR密码有什么规则吗?

时间:2014-02-26 13:20:09

标签: c# encryption xor

我有以下方法,它采用纯文本和关键文本。它应该返回一个用XOR方法加密的字符串ascii。

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&#39; G&#39; &安培; &#39; M&#39;,它是71 XOR 77它返回10.而10代表换行。这实际上不是我输出中的字符表示的。这导致长度的纯文本被加密为密码字符串,在某些情况下只有2个字符长。我想这会使解密变得不可能,即使有一把钥匙?或者ascii字符0 - 31那里但是根本看不到?

2 个答案:

答案 0 :(得分: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,我也修复了它。

答案 1 :(得分: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;
}