【问题标题】:How to reverse an algorithm using modulo and bitwise XOR operators on a JavaScript array?如何在 JavaScript 数组上使用模数和按位 XOR 运算符来反转算法?
【发布时间】:2016-08-09 22:06:07
【问题描述】:
var alphaNumbersStr = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
var hexaString      = '0123456789abcdef';
var str32           = '4af27d7ef70b1263da25022af735508b';
var str             = 'FoooooBar';

var arr = [];
for (var i = 0; i < str.length; i++) {
    arr[i] = alphaNumbersStr.indexOf(str.charAt(i));
}
// --
// Start : arr ==> [ 31, 14, 14, 14, 14, 14, 27, 0, 17 ]
// --
for (var i = 0; i < 10000; i++) {

    arr[i % str.length] += hexaString.indexOf(str32.charAt(i % 32)) ^ arr[(i + 1) % str.length] ^ arr[(i + 2) % str.length];

    if (arr[i % str.length] > alphaNumbersStr.length - 1) {
        arr[i % str.length] %= alphaNumbersStr.length;
    }
}
// --
// End : after 10000 iterations : arr ==> [ 38, 8, 32, 4, 18, 24, 2, 48, 22 ]
// --

鉴于以下 sn-p,我正在尝试反转此算法,以便我可以返回到原始数组状态(步骤 0)。

知道如何解决这个问题吗?

【问题讨论】:

  • 您能否通过将每个表达式存储在正确命名的变量中来清理代码?即var oldIndexBasedOnMonth = str32.charAt(i % 32);.
  • 当您使用 JS 编写代码时,我实际上认为这更像是一个数学问题而不是 JS 问题。给定一个数学解决方案,我认为编写所需的 JS 代码是微不足道的。
  • 出于好奇:这个问题的背景是什么?这是一些竞争问题吗?还是有人试图构建一个糟糕的(想要难以逆转的)哈希函数?
  • hexaString.indexOf(str32.charAt(i % 32)) 是静态映射,^ 是对称的,% 仅用于将值钳制/折叠到范围内(0..alphaNumbersStr.length)。您只需要更改 3 件事 arr[i % str.length] += -> -=,您必须针对负值调整钳位,并且您必须以相反的顺序执行此循环

标签: javascript algorithm hash bitwise-operators modulo


【解决方案1】:

只需向后执行所有步骤。所执行的操作使得模运算可以恢复。

function revert(arr) {                                                                
    for (let i = 9999; i >= 0; i--) {
        //we know this as these values didnt get affected this iteration
        let added = hexaString.indexOf(str32.charAt(i % 32)) ^ arr[(i + 1) % str.length] ^ arr[(i + 2) % str.length];

        //the important difference in modulo
        let modadd = added % alphaNumbersStr.length;

        //single overflow is what we need to predict
        //if we went over, we went smaller again
        let overflow = modadd > arr[i % str.length];

        //we need to undo the modulo
        if (overflow) {
            let diff = modadd - arr[i % str.length];
            arr[i % str.length] = alphaNumbersStr.length - diff;
        }
        //Not much to do otherwise
        else arr[i % str.length] -= modadd;
    }
    return arr;
}

//Just so it can be run
function change(){var result,value=document.getElementById("a").value;try{result=algorithm(eval(value))}catch(a){result=["error"]}document.getElementById("t").innerHTML="["+result.join(", ")+"]",document.getElementById("i").innerHTML="["+(result[0]==='error' ? result : revert(result)).join(", ")+"]"}function algorithm(a){for(var b=0;b<1e4;b++)a[b%str.length]+=hexaString.indexOf(str32.charAt(b%32))^a[(b+1)%str.length]^a[(b+2)%str.length],a[b%str.length]>alphaNumbersStr.length-1&&(a[b%str.length]%=alphaNumbersStr.length);return a}var alphaNumbersStr="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789",hexaString="0123456789abcdef",str32="4af27d7ef70b1263da25022af735508b",str="FoooooBar";change();
Value of <code>arr</code>:&nbsp;&nbsp;<input onblur="change()" id="a" size="50" value="[31, 14, 14, 14, 14, 14, 27, 0, 17]">
<hr>
Through algorithm:&nbsp;&nbsp;<code id="t"></code><br>
Through revert:&nbsp;&nbsp;<code id="i"></code>

【讨论】:

  • 恭喜成功!谢谢你一步一步的解释!
猜你喜欢
  • 2014-12-16
  • 1970-01-01
  • 1970-01-01
  • 2011-08-24
  • 1970-01-01
  • 2011-02-10
  • 1970-01-01
  • 1970-01-01
  • 2014-12-30
相关资源
最近更新 更多