【问题标题】:Reverse multiple XORs, ADDs function反转多个 XOR、ADD 函数
【发布时间】:2013-09-04 20:29:13
【问题描述】:

这个问题比编程问题更数学化。 我有解码许可证密钥并检查其正确性的功能。

查看代码:

ushort local6 = rand1;    // generated random = 0x2ff2
ushort local1 = rand2;    // = 0x780e
ushort local8 = rand3;    // = 0x1e3c
ushort local4 = rand4;    // = 0xf521
ushort temp1 = 0;    // always zero
ushort temp2 = 0;    // always zero

// THIS loop
for (int i = 0; i < 8; i++)
{
    local6 += stack2[0 + 6 * i];
    local1 += stack2[1 + 6 * i];
    local8 += stack2[2 + 6 * i];
    local4 += stack2[3 + 6 * i];
    temp1 = (ushort)(local6 ^ local8);
    temp1 += stack2[4 + 6 * i];
    temp2 = (ushort)((local1 ^ local4) + temp1);
    temp2 += stack2[5 + 6 * i];
    temp1 += temp2;
    local6 = (ushort)(local6 ^ temp2);
    local4 ^= temp1;
    temp1 ^= local1;
    local1 = (ushort)(local8 ^ temp2);
    local8 = temp1;
}

// Results after loop:
// local6 = 0x518a
// local1 = 0x33e5
// local8 = 0x8bca
// local4 = 0x57de

// validate date, checksums etc.
if (_validate(local6, local8, local1, local4))
    return "Key " + rand1 + "-" + "rand2" + "-" + "rand3" + "-" + "rand4" + " is valid!";
else
    return "Key invalid!";

为了更简单,我们假设:

ushort[] stack2 = new ushort[52];

for (int i = 0; i < stack2.Length; i++)
{
    stack2[i] = (ushort)i;
}

问题是;这个循环是可逆的吗? 我的意思是可以检索值

rand1, rand2, rand3, rand4 

取自循环后的值:

local6, local1, local8, local4 

知道循环函数的代码吗?我几乎可以肯定这是不可能的,但我想知道您对此有何看法。

我分享的代码是我的发明,我真的相信这种循环可以很好地保护逆向工程师(串行破解者),除非他们暴力破解。

【问题讨论】:

  • 很抱歉堵塞了您的 cmets。但这立即让我想起了我在这个问题上的“混淆订单 ID”答案:stackoverflow.com/a/18473308/2573395。我会说(没有那么认真地考虑过)除非您对代码进行逆向工程,否则即使您可以访问大量生成的密钥,也很难破解它。除非,对于大量的键,您知道它们的顺序,并且您尝试使用选定的可能适用的位/混合操作的多个排列来关联字节。
  • 我认为这属于加密 SE。
  • 为什么你认为这是不可能的?在我看来,这是微不足道的,虽然有点乏味。但是,验证功能不是您忽略的重要部分。要生成序列,您首先需要制造通过验证的值local6 等,然后反转循环。单独反转循环似乎是不够的。
  • 你可能想试试 crypto.stackexchange.com
  • 顺便说一句:为什么不... = new ushort[48]

标签: c# c++ c math reverse-engineering


【解决方案1】:

我会尝试将它放入像 Z3 这样的 SMT 求解器中。堆栈可以用常量替换。 temp2 在每一点上也是不变的。唯一让倒车变得困难的是temp2。希望 SMT 求解器能够解决这个问题。

我怀疑这里的扩散很低,因为我看不到任何旋转。

使反转更容易的是temp1temp2 在每次迭代时在循环内重新初始化。如果在整个计算过程中都携带它们会更难。

为什么不直接使用像SHA256 这样的加密哈希?

【讨论】:

    【解决方案2】:

    这可能很难,但我没有看到任何理论上的单向计算。一切似乎都是可逆的。

    【讨论】:

    • “困难”的意思是“手工做起来很乏味”。正如您所指出的,每一步都是可逆的。
    猜你喜欢
    • 2019-12-19
    • 1970-01-01
    • 2014-09-15
    • 1970-01-01
    • 2020-10-06
    • 2021-07-06
    • 1970-01-01
    • 2020-01-17
    • 2014-12-16
    相关资源
    最近更新 更多