【发布时间】:2023-04-01 02:47:01
【问题描述】:
实际的算法函数是:
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]
【问题讨论】:
-
您无法反转哈希。它们是单向函数。在适当的散列中完成的特定计算不能被反转以获得产生散列的原始值。例如
1+2 => 3很好,但3 -> ???。有无数种可能性:sqrt(9)、4-1等... -
我听到你在说什么,但这是哈希函数可以逆向工程的特殊情况。
-
@MarcB 大多数哈希函数是单向的(或关闭;真正的单向函数的存在是 CS 中的一个悬而未决的问题)。可以创建一个哈希函数,对于给定的输入域,它是可逆的。
-
确实如此,我想我应该开始更一般地思考,而不仅仅是“加密哈希”。
-
虽然这个“哈希函数”的输出看起来不仅仅是一个固定位数的单个值......它看起来与输入的大小相同。所以它不是真正的哈希
标签: javascript algorithm reverse-engineering algebra simplify