【发布时间】:2020-02-09 23:24:01
【问题描述】:
按位逆运算
我有一组加密字节,我可以使用以下函数对其进行解密:
byte b = (byte) (encrypted & 0xFF);
return b >> 5 & 0x7 | (b & 0x1F) << 3;
}
0x51 >> 5 & 0x7 | 0x51 & 0x1F << 3 = 0x98
^ ^
乍一看,它先于一个复杂的操作,所以我决定把它分成几部分。
我需要进行反向操作。我知道字节操作是如何工作的;位移似乎很容易逆转,但 AND 并不难。许多人在之前的帖子中认为您不能但想知道您对此的看法。
我注意到操作(b & 0x1F) 只返回0x0 和0x1F 的数字,当它到达0x20 时在0x0 处重新启动,所以连续直到0x39 返回0x20 和@987654329 @ 自然返回0x0。
考虑一个可能的解决方案,我必须知道一个函数"x & y = z"我知道“y”和“z”,例如"x + 0x1F = 0x1A"可以确定原始字节可能是下一个{0x1A, 0x3A, 0x5A, 0x7A, 0x9A, 0xBA, 0xDA, 0xFA}中的任何一个,但现在的问题是如何选择正确的。
尝试回答这个问题0xA1 & 0x1F = 0x1,假设"x & y = z",我们只知道y和"z",可能的x只有{0x1, 0x21, 0x41, 0x61, 0x81, 0xA1, 0xC1, 0xE1},你可以看到答案在8个可能之间字节。
也许我提出的问题很糟糕,但我无法构建反向操作。您能给我您的意见或解释如何组合这种类型的操作吗?
【问题讨论】:
-
总体来说是旋转,这样看很容易反转
-
如果你做 1110 和 0100 你不能从结果 0100 反转,如果原来是 1110 或 0100 或 0101,那是不可能的。这不是一个双唯一的投影。