我在想,当两个字节数组被异或时,有没有办法扭转这个过程?由于我很想找到答案,我在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();
}
}
Run Code Online (Sandbox Code Playgroud)
代码工作正常.现在,下面是step2的伪代码(反向XOR代码)
我很困惑如何做这个步骤2.如何反转进程以恢复原始字节数组?作为我唯一的输入是result
.这有可能吗?有没有办法做到这一点?如果答案是肯定的那么如何?
忘记数组 - 只需解决一下.
从XOR的真值表开始:
a | b | c
0 0 | 0
0 1 | 1
1 0 | 1
1 1 | 0
Run Code Online (Sandbox Code Playgroud)
如果C(输出)为零,你能算出A和B吗?答案是 ...没有!
如果你知道C是零,那么[A,B]是[0,0]或[1,1].如果C为1,则会发生同样的事情.您知道[A,B]是[0,1]或[1,0].
现在,如果你碰巧知道A 和 C,那么你可以弄清楚B.更一般地说,如果你知道两个,那么你可以找出第三个.如果您只知道一个,那么您可以将其他值缩小到两个选项,但这是您可以获得的没有其他信息
XOR是一个可逆过程;如果将结果与第一个示例中使用的相同 2 字节数组进行异或,您将得到原始结果。例如,您有一个两字节数组Array1
,然后XOR
用一个两字节数组Array2
来获取结果Array3
。如果你想拿回来Array1
,就拿走吧Array3 XOR Array2
。希望这可以帮助
根据您在评论中提到的内容:
“我必须将两个字节数组合并为一个(都具有相同的位)并反转该过程以取回原始的两个数组。”
该过程不能使用按位运算来执行。但是,当且仅当您定义解密密钥时,异或才可以反转,而在您的问题中,它不适用。
合并两组数字并且仍然能够取回原始数据的最佳实践可以通过创建 2 个线性方程和 2 个未知方程来完成。当然,在这个过程中,你在第三个数组中存储的不仅仅是“一个数字”,而是一个数学方程。这可以使用多维数组来保存每个方程的 X、Y 等值来完成。
这是抽象两个数据集合的最简单方法。
归档时间: |
|
查看次数: |
3826 次 |
最近记录: |