如何反转算法

时间:2013-11-30 01:37:02

标签: javascript

我正在尝试找到一种基于数学的方法来查找使下面代码中的if语句为true的密码。我已经写了一些粗略的答案,但这并没有帮助我理解如何以数学方式解决这个问题。我需要使if语句为true的实际密码是无关紧要的,而不是我要求的。我特别想要一些代码来启动我甚至完成我可以学习的代码,向我展示如何使用JavaScript对这个算法进行反向工程以获得答案。

var passed = false;
function checkPass(password) {
    var total = 0;
    var charlist = "abcdefghijklmnopqrstuvwxyz";

        for (var i = 0; i < password.length; i++) {
            var countone = password.charAt(i);                           
            var counttwo = (charlist.indexOf(countone));                    
            counttwo++;                                                 
            total *= 17;                                                
            total += counttwo;                                              
        }


    if (total == 248410397744610) {
        passed = true;
        alert(password);
    }
}

2 个答案:

答案 0 :(得分:3)

这是一个简单的代码片段:

function invertPass(n) {
    var all = 'abcdefghijklmnopqrstuvwxyz',
        out = '',
        offset;

    while (n > 0) {
        offset = n % 17;
        out = all.charAt(offset - 1) + out;
        n = (n - offset) / 17;
    }
    return out;
}


function createPass(password) {
    var total = 0;
    var charlist = "abcdefghijklmnopqrstuvwxyz";

        for (var i = 0; i < password.length; i++) {
            var countone = password.charAt(i);                           
            var counttwo = (charlist.indexOf(countone));                    
            counttwo++;                                                 
            total *= 17;                                                
            total += counttwo;                                              
        }

    return total;
}

var orig = 'gdclhpdhbied',
    num = createPass(orig);

console.log(invertPass(num) === orig);

答案 1 :(得分:0)

看看函数对total的实际作用取决于它的输入:它乘以17并在字母表中添加当前字符的位置。

因此,expectedTotal(例如248410397744610)将是一个可被17整除的数字加上密码最后一个字母的字母位置。使用%(模数运算符)查找所述位置(简单地说,你需要从expectedTotal中减去它以使其可被17整除),然后除以17并重复。