求解按位XOR和ROR方程

时间:2015-07-16 20:44:21

标签: c xor

我被告知x ^ ROR(x, 13) = 0x936f2a8247534566

^是XOR运算符,就像在C中一样,ROR()是一个函数,输入的位按指定的位置旋转,例如Intel processor instruction

问题是我如何找到x。尝试每个64位组合似乎有很多可能性,也许有更好的方法?

1 个答案:

答案 0 :(得分:13)

此算法

unsigned long long res = 0;
int bit = 1;
for (int k = 0, shift = 0; k < 64; k++, shift = (shift + 13) % 64)
{
    if (bit)
        res |= 1ull << shift;
    if (0x936f2a8247534566 & (1ull << shift))
        bit = 1 - bit;
}

给出答案

0x1337b33fdeadb00b

如果我们从bit = 0开始,答案就是

0xecc84cc021524ff4

这个想法如下。如果0x936f2a8247534566的最后一位是0,则表示bit[13] ^ bit[0] == 0,因此位相等。否则bit[0]bit[13]会有所不同。

同样的逻辑适用于bit[13]bit[26]等。所以基本上数字0x936f2a8247534566告诉我们原始数字的哪些位彼此相等而哪些不相等。 / p>

从步骤13开始,我们获得063(包括)之间的所有可能位置,我们只需要一个循环。