gpt4 book ai didi

c# - 对十六进制字符串进行 XOR

转载 作者:太空宇宙 更新时间:2023-11-03 19:45:05 24 4
gpt4 key购买 nike

我必须进行异或运算才能计算出解密 key 。

我预期的 key 是“0123456789ABCDEFFEDCBA9876543210”,我的样本输入是

(“8D10DA193E98524379264ADFFD043632”和“C339F7EB7339FAC87FAF0478B500422”)。第二个样本是(“00000000000000000000000000000000”和“0123456789ABCDEFFEDCBA9876543210”)

所以当我对我的第一个样本进行异或时,结果是“7123456789ABCDEFFEDCBA9876543210”,而对于我的第二个样本,我得到“123456789ABCDEFFEDCBA9876543210”,前导零被截断。

我尝试过各种方法,但这是我确定的代码:

static void Main(string[] args)
{
const string bdk1 = "8D10DA193E98524379264ADFFD043632";
const string bdk2 = "C339F7EB7339FAC87FAF0478B500422";

//const string bdk1 = "00000000000000000000000000000000";
//const string bdk2 = "0123456789ABCDEFFEDCBA9876543210";

const string expected = "0123456789ABCDEFFEDCBA9876543210";

BigInteger b1 = BigInteger.Parse(bdk1, NumberStyles.HexNumber);
BigInteger b2 = BigInteger.Parse(bdk2, NumberStyles.HexNumber);

BigInteger actual = b1 ^ b2;
string stringRet = actual.ToString("X");//.PadLeft(expected.Length, '0');

Console.WriteLine("Expected: " + expected);
Console.WriteLine("Actual : " + stringRet);

Console.ReadLine();
}
}

最佳答案

我建议您分解问题,由于这是一项数据驱动的任务,因此请使用以数据为中心的设计。因此,从一个将字节数组表示为十六进制字符串的类开始。

class HexString
{
private byte[] _data;
}

您需要能够从字节数组和字符串构造它,因此为两者添加构造函数。我们的原始存储是 byte[] 所以第一个构造函数是微不足道的。第二个构造函数使用了一些 LINQ-fu 来进行转换:

public class HexString
{
private byte[] _data;

public HexString(byte[] data)
{
_data = data;
}

public HexString(string data)
{
if ((data.Length & 1)!= 0) throw new ArgumentException("Hex string must have an even number of digits.");

_data = Enumerable.Range(0, data.Length)
.Where(x => x % 2 == 0)
.Select(x => Convert.ToByte(data.Substring(x, 2), 16))
.ToArray();
}
}

看不懂也没用,所以重写ToString()这样就可以通过控制台输出了。在此示例中,我使用了一个小技巧和 BitConverter :

    public override string ToString()
{
string hex = BitConverter.ToString(_data);
return hex.Replace("-","");
}

而且你需要能够对它进行异或,所以 overload the XOR operator 。请注意,所讨论的值是一个字节流,而不是一个数字,因此我们一次对每个字节进行异或,使用 LINQ 的 Zip() 方法组合数组:

    static public HexString operator ^(HexString LHS, HexString RHS)
{
return new HexString
(
LHS._data.Zip
(
RHS._data,
(a, b) => (byte)(a ^ b)
)
.ToArray()
);
}

完成所有这些后,您的主程序变得非常短(应该如此):

public class Program
{
static public void Main()
{
HexString bdk1 = new HexString("8D10DA193E98524379264ADFFD043632");
HexString bdk2 = new HexString("8C339F7EB7339FAC87FAF0478B500422");

const string expected = "0123456789ABCDEFFEDCBA9876543210";

HexString actual = bdk1 ^ bdk2;

Console.WriteLine("Expected: " + expected);
Console.WriteLine("Actual : " + actual);

Console.ReadLine();
}

输出:

Expected: 0123456789ABCDEFFEDCBA9876543210
Actual : 0123456789ABCDEFFEDCBA9876543210

请参阅 DotNetFiddle 上的完整解决方案。

关于c# - 对十六进制字符串进行 XOR,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46554290/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com