[英]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)
只返回0x0
和0x1F
的数字,并且当它到达0x20
时在0x0
重新启动,所以连续直到0x39
返回0x20
和0x40
自然返回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.