繁体   English   中英

如何构建反向按位运算

[英]How to build a reverse bitwise operation

位逆运算

我有一组加密字节,我可以使用以下 function 对其进行解密:

        byte b = (byte) (encrypted & 0xFF);
        return b >> 5 & 0x7 | (b & 0x1F) << 3;
    }

    0x51 >> 5 & 0x7 | 0x51 & 0x1F << 3 = 0x98
    ^                 ^

乍一看,它先于一个复杂的操作,所以我决定将它分成几部分。

我需要进行反向操作。 我知道字节操作是如何工作的; 位移似乎很容易逆转,但 AND 并不难。 许多人在以前的帖子中认为您不能但想知道您对此的看法。

我注意到操作(b & 0x1F)只返回0x00x1F的数字,并且当它到达0x20时在0x0重新启动,所以连续直到0x39返回0x200x40自然返回0x0

考虑一个可能的解决方案,我必须知道一个 function "x & y = z"我知道 "y" 和 "z",例如"x + 0x1F = 0x1A"可以确定原始字节可以是任何下一个{0x1A, 0x3A, 0x5A, 0x7A, 0x9A, 0xBA, 0xDA, 0xFA} ,但现在的问题是我如何 select 正确的一个。

尝试回答这个问题0xA1 & 0x1F = 0x1 ,假设"x & y = z" ,我们只知道y"z"可能的 x 只会是{0x1, 0x21, 0x41, 0x61, 0x81, 0xA1, 0xC1, 0xE1} ,如您所见,答案在 8 个可能的字节之间。

也许我提出的问题很糟糕,但我无法建立反向操作。 你能给我你的意见或解释如何组合这种类型的操作吗?

要找到反向操作,您应该尝试查看代码在整体上所做的事情,而不是单个操作。

|的左操作数说,

b向右移动 5 位>> 5然后清除除最低有效三位& 0x7之外的所有位。 请注意,7 是二进制的 111。

以上获取b的最高 3 位并将它们一直向右移动。 1010 1100 将变为 0000 0101。

|的右操作数说,

清除除b的最低有效 5 位之外的所有位,然后将b向左移动 3 位。 请注意,1F 是二进制的 0001 1111。

这将获得b的最低有效 5 位,然后一直向左移动。 1010 1100 将变为 0110 0000。

最后, | 将两个结果结合在一起。

所以在高级抽象上,这段代码只是在一个字节中切换前 3 位和后 5 位。 1110 0000 将变为 0000 0111。

要反转这一点,只需切换前 5 位和后 3 位。

byte b = (byte) (decrypted & 0xFF);
return b >> 3 & 0x1F | (b & 0x7) << 5;

如果您发现此答案令人困惑,您可能想了解位掩码

只需计算 256 字节的数组: m_encrypt 字节 -> 加密字节

如果它是一对一的,那么它是可逆的,否则它不是。

通过计算解密数组m_decrypt

for(int i=0; i< 256; i++)
  m_decrypt[m_encrypt[i]] = i;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM