簡體   English   中英

查找JavaScript字符串的所有組合

[英]Finding All Combinations for a JavaScript String

我剛剛讀了一篇有趣的文章Bruce Schneier-選擇安全密碼,然后想到了找出JavaScript“破解”我自己的密碼(字符串/函數參數)需要多長時間。

我如何編寫一個函數,該函數將字母(以及后面的數字,也許是特殊字符等)的所有可能組合與該函數的某個輸入參數(類型為字符串)進行比較。 可能的字符將在數組中列出。

例如:

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個字母的輸入參數的解決方案(但是仍然缺少將更長的字符串傳遞給該函數的方法)。 如何處理諸如“ cloud”,“ play”等字符串的問題非常令人困惑。我正在考慮通過for循環解決此問題,但我真的不知道從哪里開始以及如何循環我不知道長度的程序循環輸入。

我的功能:

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.
      }
  }
}

您可以簡單地遍歷字符串並遍歷所有字母:

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;
}

如果result為true,則意味着您可以從letterDB數組構建字符串。

正如評論中所說,這將是永遠的。 但是,使用遞歸實現基於置換的破解器相對簡單。

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)。 對於任何長度較大的內容,時間將極其迅速地增加。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM