Rerversing和Bitwise

时间:2010-04-10 08:52:57

标签: c algorithm cryptography reverse

以下是以下算法:

int encryption(int a, int b) {
    short int c, c2;
    uint8_t d;

    c = a ^ b;
    c2 = c;

    d = 0;
    while(c) {
        c &= c - 1;
        d++;
    }

    return d;
}

如何找到该函数中应该发送哪个变量a和b来决定d的输出值?

换句话说,如果我想要d = 11,我该怎样扭转算法呢?

3 个答案:

答案 0 :(得分:1)

d只是c中“1”位的数量,请参阅http://graphics.stanford.edu/~seander/bithacks.html#CountBitsSetKernighan

因此,您只需找到ab,使其按位XOR值恰好为11位,例如a = 0b = 2047

(这不是加密。这是一种非常弱的单向散列。加密必须提供一种方法来取回原始值(解密)。)

答案 1 :(得分:1)

此:

while(c) {
    c &= c - 1;
    d++;
}

计算c中的1位数。例如,如果c = 10110,则d为3。

此:

c = a ^ b;

ab之间exclusive or。这意味着在ab中共享相同位置的所有1位将为零,并且ab中具有不同值的所有位置将成为1.例如:

101110 ^
011010
========
110100

基本上,算法在a ^ b中找到1位的数量。要强制它输出特定值,只需a = 0然后b = number with d 1-bits

要获得d 1位的数字,请考虑b = (2 to the power of d) - 1

因此,如果您需要d = 11,那么a = 0b = (2 to the power of 11) - 1 = 2048 - 1 = 2047

要以编程方式有效地计算2到某个功率,请使用以下公式:

2 to the power of k == 1 << k

所以,基本上:encryption(a, b) == d if a = 0 and b = (1 << d) - 1

答案 2 :(得分:-1)

我看到它在XOR b中计算SET位?

好的,那么让我们说a == 0,b == 4095。