两个十六进制字节数组的XOR函数

时间:2013-12-27 15:03:26

标签: c# string hex logic xor

我正在尝试执行独占或两个字节数组,并将结果作为十六进制字符串返回。我已将两个字节数组转换为相应的二进制字符串。每个字节都有位,因为它有8个字节。

byte[] key =  { 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18 };
byte[] PAN =  { 0x12, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x23 };

到目前为止,我已经使用了一种方法,将字节数组转换为相应的二进制字符串值,例如: “10101010101”。然而,当我执行以下方法来获得XOR时,我将返回一串笑脸,这可能是一些特殊的ASCII字符。

但是我对如何做到这一点没有任何想法。我想将二进制字符串转换为整数,但这不是一个好的解决方案,因为它不适合作为整数。

请问您有什么想法吗?可能有一些示例代码?

public static string exclusiveOR(string string_1, string string_2)
{
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < string_1.Length; i++)
        sb.Append((char)(string_1[i] ^ string_2[(i % string_2.Length)]));
        String result = sb.ToString();

        return result;
}

4 个答案:

答案 0 :(得分:7)

试试这个:

public static string exclusiveOR(byte[] key, byte[] PAN)
{
    if (key.Length == PAN.Length)
    {
        byte[] result = new byte[key.Length];
        for (int i = 0; i < key.Length; i++)
        {
            result[i] = (byte)(key[i] ^ PAN[i]);
        }
        string hex = BitConverter.ToString(result).Replace("-", "");
        return hex;
    }
    else
    {
        throw new ArgumentException();
    }
}

如何工作:首先检查数组是否具有相同的长度,如果是这种情况,您将对数组执行XOR操作。 BitConverter.ToString()方法将字节数组转换为字符串,但因为有连字符来分隔每个十六进制数,所以可以使用Replace()方法删除这些破折号。

答案 1 :(得分:4)

你正确地这样做 - 你的代码XOR两个字符串的字符,如果第一个字符串恰好是较长的字符串,则绕着第二个字符串。

但是,XOR的属性是这样的,只有不同的位保留在输出中。因此,当您对0x110x12进行异或时,最终会显示0x03looks like a heart会在控制台上显示。

答案 2 :(得分:4)

我认为string是错误的类型。相反,您应该使用BitArray,它甚至已经有Xor()方法。

答案 3 :(得分:3)

IMO将它分成两部分会更好。一个函数用于执行分段XOR,另一个函数用于将字节数组转换为十六进制字符串。

public static byte[] exclusiveOR(byte[] arr1, byte[] arr2)
{
    if (arr1.Length != arr2.Length)
        throw new ArgumentException("arr1 and arr2 are not the same length");

    byte[] result = new byte[arr1.Length];

    for (int i = 0; i < arr1.Length; ++i)
        result[i] = (byte) (arr1[i] ^ arr2[i]);

    return result;
}

public static string arrayToHexString(byte[] arr)
{
    var sb = new StringBuilder();
    for (int i = 0; i < arr.Length; ++i)
        sb.Append(arr[i].ToString("x2"));
    return sb.ToString();
}

现在你可以说:

Console.WriteLine(arrayToHexString(exclusiveOR(arr1, arr2)));

您的解决方案打印奇异字符的原因是您正在对ASCII值'1''0'进行异或,因为这些是字符串中的字符。由于'1'为0x31且'0'为0x30,因此结果为0x30 xor 0x31 = 1.然后将ASCII字符0x01(这是一个不可打印的控制字符)放入结果字符串中。