我在想,当两个字节数组 XOR '时,有没有办法扭转这个过程?由于我很想找到答案,我在google中找到了这个代码,这是 XOR 代码,这是step1的伪代码( XOR 代码)
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 代码)
我很困惑如何做这个步骤2。如何反转进程以恢复原始字节数组?我唯一的输入是result
。这有可能吗?有没有办法做到这一点?如果答案是肯定的那么如何?
答案 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等的值。
这是抽象两个数据集合的最简单方法。