如何在C中反转以下算法

时间:2015-05-25 16:39:04

标签: c++ c algorithm reverse-engineering

我有以下算法:

    unsigned long specialNum=0x4E67C6A7;
    unsigned int ch;
    char inputVal[]="                        AAPB2GXG";


    for(int i=0;i<strlen(inputVal);i++)
    {
        ch=inputVal[i];

        ch=ch+(specialNum*32);
        ch=ch+(specialNum/4);

        specialNum=bitXor(specialNum,ch);
    }

    int outputVal=specialNum;

bitXor只执行Xor操作:

int bitXor(int a,int b)
{
    return (a & ~b) | (~a & b);
}

现在我要反转算法。给定outputVal,我想得到inputVal。 这是我到目前为止所做的。但它没有用:(

    while(outputVal!=0x4E67C6A7)
    {
        ch=bitXor(outputVal,0x4E67C6A7);

        outputVal=outputVal-(ch*4);
        outputVal=outputVal-(ch/32);
        inputVal[i++]=(char)ch;
        if(i>32)
            break;
    }
编辑:好的,同意不可能。但我想知道为什么我的问题被低估了。我在发布之前已经遵循了这些指导原则,我认为这个问题太糟糕了,不能用它来贬低它。

2 个答案:

答案 0 :(得分:4)

在请求的“反向”算法中,您要求将4字节数转换为任意长度的字符串。这显然是不可能的,因为假设你这样做,你发明了一种终极压缩算法。

答案 1 :(得分:2)

&#34;反向算法&#34;你要求的是不可能的。您的示例inputVal是一个超过30个字母的字符串。您的outputVal最多只有4或8个字节。信息理论规定,如果n> 1,则不可能将任意n字节串存储到k字节串中。 ķ。

您的前向算法基本上是将数组inputVal中的值打包到标量变量specialNum中,这是一种尴尬的方式。

此外,最后还存在从unsigned long specialNumint outputVal的不安全转换。