我如何将此加密转换为C#

时间:2010-12-08 17:50:06

标签: c# c

这是我使用的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语言不起作用。

Link for the full C# file

Link for the full C file

Link for the C implementation

4 个答案:

答案 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,因为它更便携。如果您的平台假定charsigned char相同,则算术(位移等)将无法正常工作。
因此,请明确指定unsigned char(如果<stdint.h>对您来说过于冗长,请使用typedef或包含unsigned char