XOR的逆过程

时间:2014-05-29 20:36:46

标签: c# reverse xor

我在想,当两个字节数组 XOR '时,有没有办法扭转这个过程?由于我很想找到答案,我在google中找到了这个代码,这是 XOR 代码,这是step1的伪代码( XOR 代码)

enter image description here

XOR 代码:

public static byte[] XOR(byte[] first, byte[] second)
    {
        if (first.Length == second.Length)
        {
            byte[] result = new byte[first.Length];
            for (int i = 0; i < first.Length; i++)
            {
                result[i] = (byte)(first[i] ^ second[i]);
            }

            return result;
        }
        else
        {
            throw new ArgumentException();
        }
    }

代码工作正常。现在,下面是step2的伪代码(反向 XOR 代码) enter image description here

我很困惑如何做这个步骤2。如何反转进程以恢复原始字节数组?我唯一的输入是result。这有可能吗?有没有办法做到这一点?如果答案是肯定的那么如何?

3 个答案:

答案 0 :(得分:7)

忘记数组 - 只需解决一下。

从XOR的真值表开始:

a | b | c
0   0 | 0
0   1 | 1
1   0 | 1
1   1 | 0

如果C(输出)为零,你能算出A和B吗?答案是 。 。 。没有!

如果您知道C为零,则[A,B]为[0,0]或[1,1]。如果C为1,也会发生同样的事情。你知道[A,B]是[0,1]或[1,0]。

现在,如果您碰巧知道A C,那么您可以弄清楚B.更一般地说,如果您知道两个,那么您可以找出第三个。如果您只知道一个,那么您可以将其他值缩小为两个选项,但只要您没有其他信息就可以获得

答案 1 :(得分:3)

XOR是一个可逆的过程;如果你使用你在第一个例子中使用的相同的2字节数组对结果进行异或,你将获得原始数据。例如。你有一个双字节数组Array1,你XOR有一个双字节数组Array2来得到结果Array3。如果您想返回Array1,只需点击Array3 XOR Array2即可。希望这有帮助

答案 2 :(得分:1)

根据你在评论中提到的内容:

&#34;我必须将两个字节数组合并为一个(都具有相同的位)并反转该过程以取回原来的两个数组。&#34;

此过程不能通过使用按位运算来执行。但是,XOR只能反转,并且只有在定义解密密钥时才会出现问题,如果您有问题,则不适用。

合并两组数字并仍然能够取回原始数据的最佳做法可以通过创建2个线性和2个未知方程来完成。当然,在这个过程中,你存储在第三个数组中的不仅仅是一个数字&#34;但是数学方程式。这可以使用多维数组来完成,以保持每个等式的X,Y等的值。

这是抽象两个数据集合的最简单方法。