【问题标题】:How to reverse this equation?如何反转这个等式?
【发布时间】:2019-05-12 12:05:19
【问题描述】:

以下代码行位于for 循环内,其中j 递增,ansString 是一串ASCII 字符,例如000\Qg$M!*P000\gQYA+ h000\M|$skd 000\Qo}plsd000\

ansString[j] = ((char)(paramString[j] >> j % 8 ^ paramString[j]));

我无法弄清楚如何让 XOR 和所有其他运算符反转以找到 paramString。感谢任何帮助。

【问题讨论】:

  • 你不能反向模运算,它需要测试所有的可能性
  • (j%8)==0 时你可以反转这个except 你应该注意到ansString 的每个第8 个字符都是零,不管输入字符是什么。我认为写这篇文章的人犯了一个错误。
  • @azro 因为我是新手,你能建议我尝试测试可能性的方法吗?
  • @MattTimmermans 很有趣,你能进一步解释为什么(j%8)==0 不可逆吗?
  • (j%8)==0ansString[j]==paramString[j]^paramString[j] 出现在0 时。所有的零都相同,因此无法确定 paramString[j] 是什么

标签: java string encryption reverse-engineering


【解决方案1】:

右移(>>)和取模(%)是不可逆的操作:

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

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

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

a ^ b = c

然后

c ^ b = a

因此,对于多个输入,您将获得相同的输出。例如,让我们以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

这意味着对于你的第一个字符和每 8 个后续字符(这是索引 j 是 8 的倍数的每个字符,所以 j % 8 = 0),结果将为 0,无论原始字符是哪个(你可以请参阅您的示例输出字符串)。

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

【讨论】:

  • 谢谢,澄清一下,我可能需要测试 (2^b * 32)^n 次?其中 n 是 ansString 的长度
  • 由于您的输入值只能是 8 位长,因此您只需测试 256 次,但即使这样您也不确定什么是正确的输出,因为多个输入会映射到相同的输出。
【解决方案2】:

如果j是一个运行索引,你就会知道每次迭代的移位量。有了它,你可以找到一个前缀并解密字符串。

例如对于j = 2(0..7 是位位置,两位数是异或位,x 为 0):

Original:   0  1  2  3  4  5  6  7
Shifted:    x  x  0  1  2  3  4  5
Encrypted:  0  1 02 13 24 35 46 57 

如您所见,前 2 位数字保持不变。而这 2 位数字用于加密接下来的两位,依此类推。

所以要使用 j = 2 进行解密,您会发现一个未加密的 2 位前缀。这可用于解密接下来的 2 位(02 和 13):

Encrypted:  0  1 02 13 24 35 46 57 
Shift-Mask: x  x  0  1  x  x  x  x
Temp1:      0  1  2  3 24 35 46 57

现在我们知道了前 4 位数字,以及接下来 2 位的解密位:

Temp1:      0  1  2  3 24 35 46 57
Shift-Mask: x  x  x  x  2  3  x  x
Temp2:      0  1  2  3  4  5 46 57

再说一遍:

Temp2:       0  1  2  3  4  5 46 57
Shift-Mask3: x  x  x  x  x  x  4  5
Decrypted3:  0  1  2  3  4  5  6  7 <- Original string

基于这个思路,可以构建解密算法

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-12
    • 2015-06-17
    • 1970-01-01
    • 2021-03-17
    • 2018-10-23
    • 2011-04-11
    • 1970-01-01
    相关资源
    最近更新 更多