我在C中有这个代码,我需要移植到C#:
void CryptoBuffer(unsigned char *Buffer, unsigned short length)
{
unsigned short i;
for(i=0; i < length; i++)
{
*Buffer ^= 0xAA;
*Buffer++ += 0xC9;
}
}
Run Code Online (Sandbox Code Playgroud)
我试过这个:
public void CryptoBuffer(byte[] buffer, int length)
{
for(int i = 0; i < length; i++)
{
buffer[i] ^= 0xAA;
buffer[i] += 0xC9;
}
}
Run Code Online (Sandbox Code Playgroud)
但结果与预期不符.
根据这个例子,这个:
A5 03 18 01...
Run Code Online (Sandbox Code Playgroud)
应该成为这样的:
A5 6F 93 8B...
Run Code Online (Sandbox Code Playgroud)
它还说第一个字节没有加密,所以这就是A5保持不变的原因.
编辑澄清:规范只是说你应该跳过第一个字节,它没有详细说明,所以我猜你只是将序列从位置1传递到最后一个位置跳过第一个字节.
但是我对C#端口的结果是:
A5 72 7B 74...
Run Code Online (Sandbox Code Playgroud)
这个端口是正确的还是我错过了什么?
编辑2:为了进一步澄清,这是一个封闭的协议,所以我不能详细说明,这就是为什么我提供了足够的信息来帮助我移植代码,C代码是给我的那个,那就是规范说它会做什么.真正的问题是规范中的"0xAA"是错误的,这就是输出不是预期的原因.这里提供的C#代码和接受的答案毕竟是正确的.
让我们分开,我们,一步一步.
void CryptoBuffer(unsigned char *Buffer, unsigned short length)
{
unsigned short i;
for(i=0; i < length; i++)
{
*Buffer ^= 0xAA;
*Buffer++ += 0xC9;
}
}
Run Code Online (Sandbox Code Playgroud)
无论其他一些评论如何,这就是你通常在C/C++中做这些事情的方法.这段代码并没有什么特别之处,而且它并不过分复杂,但我认为将其分解以向您展示会发生什么是很好的.
注意事项:
这里唯一的"困难"是Buffer ++.详细信息可以在Sutter的"Exceptional C++"一书中阅读,但是一个小例子也解释了这一点.幸运的是,我们有一个完美的例子供我们使用.甲字面上述代码的翻译是:
void CryptoBuffer(unsigned char *Buffer, unsigned short length)
{
unsigned short i;
for(i=0; i < length; i++)
{
*Buffer ^= 0xAA;
unsigned char *tmp = Buffer;
*tmp += 0xC9;
Buffer = tmp + 1;
}
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,临时变量可以通过简单的方式解决,这导致我们:
void CryptoBuffer(unsigned char *Buffer, unsigned short length)
{
unsigned short i;
for(i=0; i < length; i++)
{
*Buffer ^= 0xAA;
*Buffer += 0xC9;
++Buffer;
}
}
Run Code Online (Sandbox Code Playgroud)
现在将此代码更改为C#非常简单:
private void CryptoBuffer(byte[] Buffer, int length)
{
for (int i=0; i<length; ++i)
{
Buffer[i] = (byte)((Buffer[i] ^ 0xAA) + 0xC9);
}
}
Run Code Online (Sandbox Code Playgroud)
这与您的移植代码基本相同.这意味着在未来的某个地方出现了其他问题...所以,我们应该破解加密缓冲器吗?:-)
如果我们假设没有使用第一个字节(如你所说)并且'0xAA'和/或'0xC9'是错误的,我们可以简单地尝试所有组合:
static void Main(string[] args)
{
byte[] orig = new byte[] { 0x03, 0x18, 0x01 };
byte[] target = new byte[] { 0x6F, 0x93, 0x8b };
for (int i = 0; i < 256; ++i)
{
for (int j = 0; j < 256; ++j)
{
bool okay = true;
for (int k = 0; okay && k < 3; ++k)
{
byte tmp = (byte)((orig[k] ^ i) + j);
if (tmp != target[k]) { okay = false; break; }
}
if (okay)
{
Console.WriteLine("Solution for i={0} and j={1}", i, j);
}
}
}
Console.ReadLine();
}
Run Code Online (Sandbox Code Playgroud)
我们去:oops没有解决方案.这意味着cryptobuffer没有做你认为它正在做的事情,或者这里缺少部分C代码.F.ex. 他们真的将'Buffer'传递给CryptoBuffer方法还是之前更改了指针?
最后,我认为这里唯一的好答案是缺少解决这个问题的关键信息.