XOR的逆过程

Gil*_*eed 3 c# reverse 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();
        }
    }
Run Code Online (Sandbox Code Playgroud)

代码工作正常.现在,下面是step2的伪代码(反向XOR代码) 在此输入图像描述

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

Pet*_*man 8

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

从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.更一般地说,如果你知道两个,那么你可以找出第三个.如果您只知道一个,那么您可以将其他值缩小到两个选项,但这是您可以获得的没有其他信息


bka*_*521 5

XOR是一个可逆过程;如果将结果与第一个示例中使用的相同 2 字节数组进行异或,您将得到原始结果。例如,您有一个两字节数组Array1,然后XOR用一个两字节数组Array2来获取结果Array3。如果你想拿回来Array1,就拿走吧Array3 XOR Array2。希望这可以帮助

  • 您要求将 128 位编码为 64 位,然后无损解码?如果你能弄清楚这一点,你就会拥有一种漂亮的压缩算法 (3认同)

Tra*_*ent 2

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

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

该过程不能使用按位运算来执行。但是,当且仅当您定义解密密钥时,异或才可以反转,而在您的问题中,它不适用。

合并两组数字并且仍然能够取回原始数据的最佳实践可以通过创建 2 个线性方程和 2 个未知方程来完成。当然,在这个过程中,你在第三个数组中存储的不仅仅是“一个数字”,而是一个数学方程。这可以使用多维数组来保存每个方程的 X、Y 等值来完成。

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