如何从HEX字符串中提取两个组件,反向异或

时间:2018-05-18 15:50:17

标签: c# xor

我需要生成一个随机的32个字符串HEX字符串。我有代码可以生成例如E272E28B8961FB155E3FC657831F0690

现在,我需要将其分解为两个32字符串,使得字符串1 XOR字符串2的值将= E272E28B8961FB155E3FC657831F0690

我似乎很难绕过那条头。我想我需要对这个字符串进行反向XOR。有关如何实现这一目标的任何建议吗?

1 个答案:

答案 0 :(得分:2)

假设您需要两个32个十六进制字符串(相当于16个字节),它们将与已知的32个十六进制字符串进行异或,您可以使用此方法。

为输出的第一部分生成随机字节,然后根据第一部分和预期输出计算第二部分必须是什么。 XOR是一个自反转运算符(我忘了这个有一个奇特的词),所以这很简单。

void q50415070()
{
    var random = new Random();
    var output = new byte[16];

    random.NextBytes(output);
    Debug.WriteLine(BitConverter.ToString(output));
    // 91-77-E9-2F-EC-F7-8E-CC-03-AF-37-FD-4F-6F-D2-4D

    var part1 = new byte[16];
    random.NextBytes(part1);
    Debug.WriteLine(BitConverter.ToString(part1));
    // 7A-9B-2B-8B-D7-CE-AA-7E-7E-C3-FE-FF-44-2A-21-3C

    var part2 = part1.Zip(output, (x, y) => (byte)(x ^ y)).ToArray();
    Debug.WriteLine(BitConverter.ToString(part2));
    // EB-EC-C2-A4-3B-39-24-B2-7D-6C-C9-02-0B-45-F3-71
}

在此,output是我想要达到的结果,part1part2是我希望能够一起异化以获得预期的两个组件输出

我已经使用Linq Zip方法将两个IEnumerable<byte>逐个元素组合在一起,然后使用XOR运算符^逐个字节地计算结果。最后调用ToArray()使其最终回到数组中。

这种技术经常用于密码学中,您希望将加密密钥分成两部分,供两个人使用,每个部分本身都是无用的。

编辑:稍微调整一下这个功能,以便更接近您的问题:

void q50415070()
{
    var output = new byte[16] { 0xE2, 0x72, 0xE2, 0x8B, 0x89, 0x61, 0xFB, 0x15, 0x5E, 0x3F, 0xC6, 0x57, 0x83, 0x1F, 0x06, 0x90 };
    Debug.WriteLine(BitConverter.ToString(output));
    // E2-72-E2-8B-89-61-FB-15-5E-3F-C6-57-83-1F-06-90

    var random = new Random();

    var part1 = new byte[16];
    random.NextBytes(part1);
    Debug.WriteLine(BitConverter.ToString(part1));
    // 59-37-D0-A6-71-CC-6C-17-96-02-70-CE-A7-57-06-25

    var part2 = part1.Zip(output, (x, y) => (byte)(x ^ y)).ToArray();
    Debug.WriteLine(BitConverter.ToString(part2));
    // BB-45-32-2D-F8-AD-97-02-C8-3D-B6-99-24-48-00-B5
}

希望这有帮助