这种反向工程算法如何工作?

时间:2016-08-11 21:39:29

标签: javascript algorithm reverse-engineering algebra simplify

实际的算法功能是:

output[i] = ( (129 * input[i]) XOR input[i-1]) % 256 //input[-1] = 0

有几个解决方案。通常完成的是:

var output = [0, 129, 3, 129, 7, 129, 3, 129, 15, 129, 3, 129, 7, 129, 3, 129];
var outputToInputArray = function(array) {
  var input = [];
  var outputToInput = function(dig, lastInput) {
    var current = dig;

    while(true) {
      if (!((current ^ lastInput) % 129)) {
        return (current ^ lastInput)/129;
      }
      current += 256;
    }
  }

  for(var i = 0; i < output.length; i++) {
    input.push(outputToInput(output[i], i>0 ? input[i-1] : 0));
  }

  return input;
}

console.log(outputToInputArray(output));

然而,我刚刚来了:

output = [0, 129, 3, 129, 7, 129, 3, 129, 15, 129, 3, 129, 7, 129, 3, 129]
var input = [];
for(var i =0; i < output.length; i++) {
    lastInput = input.length < 1 ? 0 : input[i-1];
    input.push(((output[i] ^ lastInput) * 129) % 256);
}
console.log(input);

当被要求反转函数时要遵循的想法是代数反转函数。但是,第二种解决方案似乎以一种不应在数学上有效的方式简化反转功能!但它的确有效!请帮忙!

P.S。预期产出为[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]

2 个答案:

答案 0 :(得分:4)

首先,你的&#34;哈希函数&#34;并不是传统意义上的哈希函数。散列函数通常采用输入(可以是可变大小,例如字符串)并将其转换为固定位数的单个值。这种类型的功能实际上无法逆转,因为在转换过程中会丢失许多位数据;你不能从4位重构100位。

您的函数将字节列表转换为另一个等长字节列表。看起来它需要当前输入,通过函数x => (x*129)%256运行它,然后使用之前的输入xor运行它。

函数f(x) = (x*129) % 256是有趣的部分。如果输入是偶数,则输出是相同的数字。如果输入是奇数,则输出是第7位(第127位)反转的输入。 (尝试自己插入几个值。)因此,f(x)是它自己的逆; f(f(x)) == x

因此,整个&#34;哈希函数&#34;可以像这样颠倒:

  • xor当前哈希值与前一个输入值,或0如果是第一个
  • 通过f(x)函数运行结果,以便在计算值时反转f(x)
  • 重复每个值

...这是你的最后片段所做的。我不确定第一个。

答案 1 :(得分:4)

  

注意:写完这个答案后,我重新阅读了qxz的答案,并且   意识到这里所涵盖的一切也包含在qxz的答案中。   但我还是决定发布这个,因为略有不同   格式可能对某些人有所帮助。

要理解为什么会这样,你所要做的就是计算

y = (129 * x) % 256;  

表示0到255之间的每个x。从偶数开始

for ( x = 0; x < 256; x += 2 ) {
    y = (129 * x) % 256; 
    console.log(y);
}

输出

  0   0
  2   2
  4   4
  6   6
  8   8
 10  10
 12  12
 14  14
... ...

换句话说,当你以129模256的倍数复数时,偶数也不会改变。

奇数的输出是

  1 129
  3 131
  5 133
  7 135
  9 137
 11 139
... ...
125 253
127 255
129   1
131   3
133   5
... ...

换句话说,乘以129模256可以与模数256加上128相同。所以当你做两次时,你会得到原始数字:(x + 128 + 128) % 256 = x

公式的其余部分对此没有任何影响。模数256降低位7以上的任何位,保持低8位。 XOR对第7位以上的位没有影响,它只是反转低8位中的一些。因此,XOR和模256之间没有相互作用.XOR只影响低8位,模数只影响高位。

这意味着在反转计算时,您可以先执行XOR以获得较低的8位。然后乘以129模256可以无效(如果数是偶数)或者它增加128模256(如果数是奇数)。无论哪种方式,你都会得到原始号码。