求解按位 XOR 和 ROR 方程
Solving bitwise XOR and ROR equation
有人告诉我 x ^ ROR(x, 13) = 0x936f2a8247534566
^
是 XOR 运算符,就像在 C 中一样,而 ROR()
是一个函数,它 向右旋转 输入的位职位数量,例如 Intel processor instruction.
问题是如何找到 x
。每个64位的组合都尝试了很多可能性,也许有更好的方法?
这个算法
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
告诉我们原始数字的哪些位彼此相等,哪些不相等.
由于步骤13
我们得到了0
和63
(含)之间的所有可能位置,我们只需要一个循环。
有人告诉我 x ^ ROR(x, 13) = 0x936f2a8247534566
^
是 XOR 运算符,就像在 C 中一样,而 ROR()
是一个函数,它 向右旋转 输入的位职位数量,例如 Intel processor instruction.
问题是如何找到 x
。每个64位的组合都尝试了很多可能性,也许有更好的方法?
这个算法
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
告诉我们原始数字的哪些位彼此相等,哪些不相等.
由于步骤13
我们得到了0
和63
(含)之间的所有可能位置,我们只需要一个循环。