实际的算法功能是:
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]
答案 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(如果数是奇数)。无论哪种方式,你都会得到原始号码。