javascript - 这种逆向工程算法是如何工作的?

标签 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);

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

附言预期输出为 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]

最佳答案

Note: after writing up this answer, I re-read the answer by qxz, and realized that everything covered here is also covered in qxz's answer. But I've decided to post this anyways, since a slightly different format may be helpful to some.

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

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 与将 128 加到模 256 上是一样的。所以当你这样做两次时,你会得到原来的数字:(x + 128 + 128) % 256 = x

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

也就是说在逆向计算的时候,可以先异或取回低8位。然后乘以 129 模 256 要么什么都不做(如果数字是偶数),要么加上 128 模 256(如果数字是奇数)。无论哪种方式,您都会得到原来的号码。

关于javascript - 这种逆向工程算法是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38906551/

相关文章:

algorithm - 考试中的哈希表

python - 如何将 DataFrame 反转回其代码形式?

objective-c - 查找器方法名称

javascript - 出现错误 TypeError : Cannot read property 'id' of undefined using React/Redux action

javascript - 获取没有方法错误AngularJS Bootstrap HTML

javascript - 将元素附加到 div,但位于 div 内的另一个元素之前

java - 组合 n 个列表列表保存顺序(Java)

javascript - Hogan/Mustache 的持久模板(或重复使用模板)?

java - 需要 map 验证路径框架的建议

database - 使用 Visio 自动化逆向工程数据库模型