查找JavaScript字符串的所有组合

时间:2015-11-09 16:55:25

标签: javascript

我刚刚阅读了一篇有趣的文章Bruce Schneier - Choosing Secure Passwords,并提出了一个想法,即找出JavaScript需要多长时间“破解”我自己的密码(字符串/函数参数)。

如何编写一个函数,简单地将所有可能的字母组合(以及后来的数字,可能是特殊字符等)与该函数的某个输入参数(类型为字符串)进行比较。可能的字符将列在数组中。

e.g:

var letterDB = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"];
// actually I would like to use a Regular Expression instead of my own letterDB, but for the beginning it is fine.

我可以找到只有1个字母的输入参数的解决方案(但我仍然缺少将更长的字符串传递给该函数)。如何处理像“云”,“播放”等字符串的问题是非常令人困惑的。我正在考虑用for循环来解决这个问题,但我真的不知道从哪里开始循环以及我如何programm循环输入,我还不知道它的长度。

我的功能:

function crack(x) {
  var timerStart = Date.now();  //for curiosity I want to log the time of the entire calculation
  var s = String(x);            //make sure the input is of type string (gets interesting when numbers are used in the string)

  for(i=0; i < letterDB.length; i++) {
      if (s == letterDB[i]) {
          console.log("found same combination as your input");
          console.log("letter was: " + letterDB[i]);
          console.log("interval: " + i);
          console.log("calculation time:", Date.now() - timerStart);  //interesting to see the time of the calculation when my input parameters will get longer and harder to crack because of special characters.
      }
  }
}

2 个答案:

答案 0 :(得分:0)

您可以简单地遍历字符串并遍历所有字母:

function crack(x) {
    var timerStart = Date.now();
    x = x.toString();
    var charsArr = s.split('');
    var result = charsArr.every(function(char) {
        return letterDB.includes(char);
    });
    if (result) {
        console.log("Success! calculation time:", Date.now() - timerStart);
    }
    console.log("fail");
    return result;
}

如果结果为true,则表示您可以从letterDB数组构建字符串。

答案 1 :(得分:0)

正如评论中所说,这将需要永远。但是,使用递归实现基于排列的破解程序相对简单。

var input = "ad";
var done = false;
var maxLength = 2;
var letterDB = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"];

function recursion (str) {
   for (var i=0; i < letterDB.length; i++) {
      var test = str+letterDB[i];
      if (test !== input && !done && str.length < maxLength) {
         recursion(test);
      } else if (test === input) {
         done = true;
         alert("your pass is "+test);
      }
   }
}
recursion("");

为了衡量这是多么慢,密码cloud花了我33秒才找到(正确设置了maxlength)。对于任何长度较大的东西,时间会非常迅速地升级。