这个问题比编程问题更具数学性。 我有解码许可证密钥并检查其正确性的功能。
参见代码:
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
了解循环函数的代码?我几乎可以肯定这是不可能的,但想知道你对此的看法。
我共享的代码是我的发明,我真的相信这种循环可以比逆向工程师(连续破解者)更好地保护,除非它们强制执行。
答案 0 :(得分:1)
我会尝试将其放入像Z3这样的SMT求解器中。堆栈可以用常量替换。 temp2
在每一点也都是不变的。唯一能使逆转困难的事情是temp2
。希望SMT求解器可以解决这个问题。
我怀疑这里的扩散很少,因为我没有看到任何轮换。
更容易反转的是,temp1
和temp2
在每次迭代时都会在循环内重新初始化。如果将它们带到整个计算中会更难。
为什么不使用像SHA256
这样的加密哈希?
答案 1 :(得分:1)
可能很难,但我没有看到任何理论上的单向计算。一切似乎都是可逆的。