这是我使用的C#代码:
public void Decrypt(byte[] @in, byte[] @out, int size)
{
lock (this)
{
for (ushort i = 0; i < size; i++)
{
if (_server)
{
@out[i] = (byte)(@in[i] ^ 0xAB);
@out[i] = (byte)((@out[i] << 4) | (@out[i] >> 4));
@out[i] = (byte)(ConquerKeys.Key2[_inCounter >> 8] ^ @out[i]);
@out[i] = (byte)(ConquerKeys.Key1[_inCounter & 0xFF] ^ @out[i]);
}
else
{
@out[i] = (byte)(ConquerKeys.Key1[_inCounter & 0xFF] ^ @in[i]);
@out[i] = (byte)(ConquerKeys.Key2[_inCounter >> 8] ^ @out[i]);
@out[i] = (byte)((@out[i] << 4) | (@out[i] >> 4));
@out[i] = (byte)(@out[i] ^ 0xAB);
}
_inCounter = (ushort)(_inCounter + 1);
}
}
}
这就是我将其转换为在C中工作的方式。
char* decrypt(char* in, int size, int server)
{
char out[size];
memset(out, 0, size);
for (int i = 0; i < size; i++)
{
if (server == 1)
{
out[i] = in[i] ^ 0xAB;
out[i] = out[i] << 4 | out[i] >> 4;
out[i] = Key2[incounter >> 8] ^ out[i];
out[i] = Key1[incounter & 0xFF] ^ in[i];
}
else if (server == 0)
{
out[i] = Key1[incounter & 0xFF] ^ in[i];
out[i] = Key2[incounter >> 8] ^ out[i];
out[i] = out[i] << 4 | out[i] >> 4;
out[i] = out[i] ^ 0xAB;
}
incounter++;
}
return out;
}
但由于某种原因,C语言不起作用。
答案 0 :(得分:3)
我看到的最明显的错误是你返回一个指向堆栈分配数组的指针,在decrypt()
返回后,它将被下一个函数调用踩踏。您需要malloc()
缓冲区或传入指向可写缓冲区的指针。
答案 1 :(得分:3)
发生翻译错误。
C#行:
@out[i] = (byte)(ConquerKeys.Key1[_inCounter & 0xFF] ^ @out[i]);
变成了:
out[i] = Key1[incounter & 0xFF] ^ in[i];
xor(^)右侧的值来自错误的数组。
此外,您将返回堆栈分配的变量,这将导致各种问题。
变化:
char out[size];
memset(out, 0, size);
为:
char *out = (char*)calloc(size, sizeof(char));
答案 2 :(得分:1)
您正在返回对非法的本地变量的引用。让调用者传入一个数组或使用malloc()在方法中创建一个数组。
答案 3 :(得分:1)
我还建议将char
转换为unsigned char
,因为它更便携。如果您的平台假定char
与signed char
相同,则算术(位移等)将无法正常工作。
因此,请明确指定unsigned char
(如果<stdint.h>
对您来说过于冗长,请使用typedef或包含unsigned char
。