C# 如何从十六进制字符串中提取两个组件,反向异或

C# 如何从十六进制字符串中提取两个组件,反向异或,c#,xor,C#,Xor,我需要生成一个随机的32字符十六进制字符串。我已经准备好了生成例如E272E28B8961FB155E3FC657831F0690的代码 现在,我需要将其分解为两个32字符的字符串,这样字符串1的值或字符串2的值将=E272E28B8961FB155E3FC657831F0690 我似乎很难理解这一点。我想我需要对这个字符串进行反向异或运算。关于如何实现这一点有什么建议吗?假设您需要两个32个十六进制字符串(相当于16个字节),它们将异或为已知的32个十六进制字符串,则可以使用此方法 为输出的第

我需要生成一个随机的32字符十六进制字符串。我已经准备好了生成例如E272E28B8961FB155E3FC657831F0690的代码

现在,我需要将其分解为两个32字符的字符串,这样字符串1的值或字符串2的值将=E272E28B8961FB155E3FC657831F0690


我似乎很难理解这一点。我想我需要对这个字符串进行反向异或运算。关于如何实现这一点有什么建议吗?

假设您需要两个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
是我试图达到的结果,
part1
part2
是我希望能够异或在一起以获得预期输出的两个组件

我使用Linq
Zip
方法将两个
IEnumerable
s元素逐个组合在一起,然后使用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
}

希望这有帮助

假设您需要两个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
是我试图达到的结果,
part1
part2
是我希望能够异或在一起以获得预期输出的两个组件

我使用Linq
Zip
方法将两个
IEnumerable
s元素逐个组合在一起,然后使用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
}

希望这有帮助

一个“反向异或”就是异或。此外,16个字符的字符串异或16个字符的字符串将生成16个字符的字符串,而不是32个字符的字符串。你确定这就是你的意思吗?两个16个字符的字符串之间的异或怎么能变成32个字符的字符串?谢谢你指出这一点,伙计们,我现在很困惑。我的意思是说32个字符的字符串。这背后的想法是,我的字符串E272E28B8961FB155E3FC657831F0690将发送给第三方。然后我需要从中提取一个32个字符的字符串,并将其发送给人员a。另一个32个字符的字符串发送给人员B。然后,他们会将其输入到应用程序中。如果人员A和人员B的XOR=第三方字符串,则资金将被转移。@Waddaulookingat:不要只是在评论中这样说-你应该能够编辑你的问题以更新内容,并使其更清楚地表明你在追求什么。“反向XOR”就是XOR。此外,16个字符的字符串异或16个字符的字符串将生成16个字符的字符串,而不是32个字符的字符串。你确定这就是你的意思吗?两个16个字符的字符串之间的异或怎么能变成32个字符的字符串?谢谢你指出这一点,伙计们,我现在很困惑。我的意思是说32个字符的字符串。这背后的想法是,我的字符串E272E28B8961FB155E3FC657831F0690将发送给第三方。然后我需要从中提取一个32个字符的字符串,并将其发送给人员a。另一个32个字符的字符串发送给人员B。然后,他们会将其输入到应用程序中。如果人员A和人员B的XOR=第三方字符串,则资金将被转移。@Waddaulookingat:不要只是在评论中这样说-您应该能够编辑您的问题以更新内容,并使其更清楚您的目的。谢谢Trevor。你在钱上是对的这是我正在做的cryto相关的东西…这背后的想法是,我的字符串E272E28B8961FB155E3FC657831F0690将获得第三方。然后我需要从中提取一个32个字符的字符串,并将其发送给人员a。另一个32个字符的字符串发送给人员B。然后,他们会将其输入到应用程序中。如果人员A和人员B的异或=第三方字符串,则将转账。如果这样做符合我的要求,我将很快与您联系。根据您的流程,使用
RNGCryptoServiceProvider
而不是
Random
来添加安全性也是值得的。谢谢Trevor。你在钱上是对的这是我正在做的cryto相关的东西…这背后的想法是,我的字符串E272E28B8961FB155E3FC657831F0690将获得第三方。然后我需要从中提取一个32个字符的字符串,并将其发送给人员a。另一个32个字符的字符串发送给人员B。然后,他们会将其输入到应用程序中。如果人员A和人员B的异或=第三方字符串,则将转账。如果这样做符合我的要求,我会很快给你回复。使用
RNGCryptoServiceProvider
而不是
Random