如何扭转这个等式?

Ray*_*err 1 java string encryption reverse-engineering

下面的代码行在一个for循环中,其中j增加ansString了一个ASCII字符串,如000\Qg$M!*P000\gQYA+ h000\M|$skd 000\Qo}plsd000\.

ansString[j] = ((char)(paramString[j] >> j % 8 ^ paramString[j]));
Run Code Online (Sandbox Code Playgroud)

我无法弄清楚如何让XOR和所有其他操作员反向找到paramString.感谢任何帮助.

use*_*588 6

正确的bitshift(>>)和modulo(%)是不可逆操作:

在正确的位移的情况下,下溢的位丢失,因此反转a >> b将为您留下2 ^ b个不同的可能结果.

对于模运算符,x % 8 = yx 中有32个可能的值,因为它的最大长度为8位.(这将是每个x * 8 + y适合8位)

xor操作是唯一可逆的操作.如果你有

a ^ b = c
Run Code Online (Sandbox Code Playgroud)

然后

c ^ b = a
Run Code Online (Sandbox Code Playgroud)

因此,对于多个输入,您将获得相同的输出.例如,让我们来看看j = 0

j % 8 = 0 % 8 = 0

paramString[j] >> (j % 8) = paramString[0] >> 0 = paramString[0]

paramString[0] ^ paramString[j] = paramString[0] ^ paramString[0] = 0
Run Code Online (Sandbox Code Playgroud)

这意味着对于您的第一个字符和每个第8个后续字符(这是其索引j是8的倍数的每个字符,所以j % 8 = 0)结果将为0,无论原始字符是什么(如您在示例输出字符串中所示) ).

这就是为什么,即使你强制每一个可能的输入(总共256*n个可能的输入字符串,n是字符串长度),你永远无法确定原始输入是什么,因为许多输入产生相同的输出.