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.感谢任何帮助.
正确的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是字符串长度),你永远无法确定原始输入是什么,因为许多输入产生相同的输出.