【问题标题】:Transform class from C++ to C#将类从 C++ 转换为 C#
【发布时间】:2019-02-23 06:25:58
【问题描述】:

我是 C# 新手,我需要使用我以前在 PHP 中使用的类,但现在我在 C++ 中使用它,问题是我不知道如何以正确的方式将其转换为 C#,我一直尝试但我没有得到正确的结果。

类应该加密我输入的字符串,例如如果我输入“HelloDog”,你应该返回代码“C5WXRH0CX9NE10”。

这是我在 C++ 中的原始代码:

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <string.h>

uint32_t stepa(uint32_t ins)
{
    uint32_t res = 0;
    uint32_t dat;
    uint8_t* key = (uint8_t*)"\x1A\x1F\x11\x0A\x1E\x10\x18\x02\x1D\x08\x14\x0F\x1C\x0B\x0D\x04\x13\x17\x00\x0C\x0E\x1B\x06\x12\x15\x03\x09\x07\x16\x01\x19\x05\x12\x1D\x07\x19\x0F\x1F\x16\x1B\x09\x1A\x03\x0D\x13\x0E\x14\x0B\x05\x02\x17\x10\x0A\x18\x1C\x11\x06\x1E\x00\x15\x0C\x08\x04\x01";
    int i;
    for(i = 0; i < 64; i++)
    {
        dat = ins - (ins & 0xFFFFFFFE);
        ins >>= 1;
        if(dat)
        {
            res += dat << key;
        }
        if(!ins)
        {
            return res;
        }
    }
    return res;
}

void stepb(uint32_t ins)
{
    uint8_t* key = (uint8_t*)"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    uint32_t dat;
    int i;
    for(i = 0; i < 7; i++)
    {
        dat =   
        ins -= ((dat * 9) << 2);
        if(ins < 36)
        {
            printf("%c", key[ins]);
        }
        ins = dat;
    }
}

int main(int argc, char** argv)
{
    if(argc < 2)
    {
        if(argc == 1)
        {
            printf("usage: %s password\n", argv[0]);
        }
        return 0;
    }
    uint8_t len;
    uint8_t i;
    uint8_t xtr;
    uint32_t* dat;

    len = strlen(argv[1]);
    xtr = len % 4;
    if(xtr)
    {
        xtr = 4 - xtr;
    }

    dat = (uint32_t*)malloc(len + xtr);
    memcpy((void*)dat, (void*)argv[1], len);
    if(xtr)
    {
        memset((void*)(((uint8_t*)dat) + len), 0, xtr);
        len += xtr;
    }
    len /= 4;
    for(i = 0; i < len; i++)
    {
        stepb(stepa(dat + 0x3e8));
    }
    printf("\n");
    return 0;
}

这是我尝试在 C# 中使用的代码,似乎一切都很好,但我没有收到任何价值:

static class Test
{
    private static UInt32 stepa (UInt32 ins)
    {
        UInt32 res = 0;
        UInt32 dat;
        byte[] key = Encoding.Default.GetBytes("\x1A\x1F\x11\x0A\x1E\x10\x18\x02\x1D\x08\x14\x0F\x1C\x0B\x0D\x04\x13\x17\x00\x0C\x0E\x1B\x06\x12\x15\x03\x09\x07\x16\x01\x19\x05\x12\x1D\x07\x19\x0F\x1F\x16\x1B\x09\x1A\x03\x0D\x13\x0E\x14\x0B\x05\x02\x17\x10\x0A\x18\x1C\x11\x06\x1E\x00\x15\x0C\x08\x04\x01");
        int i;
        for (i = 0; i < 64; i++)
        {
            dat = ins - (ins & 0xFFFFFFFE);
            ins >>= 1;
            if (string.IsNullOrEmpty(dat.ToString()))
            {
                res += dat << key[i];
            }
            if (string.IsNullOrEmpty(ins.ToString()))
            {
                return res;
            }
        }
        return res;
    }

    private static void stepb (UInt32 ins)
    {
        byte[] key = Encoding.Default.GetBytes("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ");
        UInt32 dat;
        int i;
        for (i = 0; i < 7; i++)
        {
            dat = (UInt32)(((UInt64)ins) * 0x38e38e39) >> 35;
            ins -= ((dat * 9) << 2);
            if (ins < 36)
            {
                Console.WriteLine("%c", key[ins]);
            }
            ins = dat;
        }
    }

    public static int encrypt(string argv)
    {
        int len = argv.Length;
        int xtr = len % 4;
        if (string.IsNullOrEmpty(xtr.ToString()))
        {
            xtr = 4 - xtr;
            len += xtr;
        }
        len /= 4;
        for (int i = 0; i < len; i++)
        {
            stepb(stepa((UInt32)argv[i] + 0x3e8));
        }
        return 0;
    }
}

【问题讨论】:

  • 好吧,你不在这里调用任何东西,你希望如何得到任何东西?同样在您的 c++ 代码中,stepb 以下行应该做什么dat =

标签: c# c++ encryption encoding


【解决方案1】:

我不确定您是否在程序中调用了 Encrypt 函数。如果没有,你可以使用下面的 main 函数来调用:

public static void Main()
{
   Test.encrypt("HelloDog");
}

在你的逻辑中,stepb 函数 dat 值始终为零(我在 C++ 中也找不到)。因此,对于任何输入字符,你在控制台中只得到 48(0)

也代替 Console.WriteLine("%c", key[ins]);
你应该使用 Console.Write((char)key[ins]);

【讨论】:

    猜你喜欢
    • 2016-09-10
    • 1970-01-01
    • 2013-10-25
    • 2015-11-01
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多