反转多个XOR、ADDs函数

本文关键字:ADDs 函数 XOR | 更新日期: 2023-09-27 18:29:46

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

参见代码:

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 

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

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

反转多个XOR、ADDs函数

我会尝试将其放入像Z3这样的SMT求解器中。堆栈可以替换为常量。CCD_ 1在每个点也是恒定的。唯一使逆转困难的是temp2。希望SMT求解器能够处理这个问题。

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

更容易逆转的是,temp1temp2在每次迭代时都在循环内重新初始化。如果把它们带到整个计算过程中,那就更难了。

为什么不使用像SHA256这样的加密散列呢?

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