Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP中用于猜测密码的递归函数?_Php_Recursion_Enumeration - Fatal编程技术网

PHP中用于猜测密码的递归函数?

PHP中用于猜测密码的递归函数?,php,recursion,enumeration,Php,Recursion,Enumeration,我需要写一个递归函数,可以猜测一个4个字符长的密码。 我用它来生成一个随机的“密码”: 我相信我正在寻找的是位移位(在我迭代了62次[26+26+10=小写+大写+数字])之后,然后再次递归调用该函数,但我不知所措 还是我想得太多了 PS:我确实在google上查找过它,但由于某些原因,我找不到与字符串枚举匹配的递归函数的具体内容,也找不到在这里进行检查的内容。不过,我的1337搜索技能可能让我失望。猜测您刚刚生成的密码似乎有点没用。。。你为什么不直接“猜”那个密码?此外,在生成所有可能的4个字

我需要写一个递归函数,可以猜测一个4个字符长的密码。 我用它来生成一个随机的“密码”:

我相信我正在寻找的是位移位(在我迭代了62次[26+26+10=小写+大写+数字])之后,然后再次递归调用该函数,但我不知所措

还是我想得太多了


PS:我确实在google上查找过它,但由于某些原因,我找不到与字符串枚举匹配的递归函数的具体内容,也找不到在这里进行检查的内容。不过,我的1337搜索技能可能让我失望。

猜测您刚刚生成的密码似乎有点没用。。。你为什么不直接“猜”那个密码?此外,在生成所有可能的4个字母的单词之前,除非它等于您从一开始就知道的密码,否则没有任何乐趣。谈论低效的代码

为了使这一点不那么琐碎,我将假设需要猜测密码的函数不会将密码作为参数获取(因为它可以将密码作为唯一正确的猜测返回),而是获取一个回调函数,它可以调用该函数来验证以下哪一项为真:

  • 猜测完全正确:回调将返回值2
  • 猜测与密码的第一个字符匹配,但完整匹配需要更多字符:在这种情况下,回调将返回1
  • 所有其他情况:回调将返回0
因此,该回调函数如下所示:

$counter = array(1, 0, 0, 0);
function enumurate(){
  global $counter;
  if($counter[0] != 0){
    echo $counter[0];
    if($counter[1] != 0){
      echo $counter[1];
      if($counter[2] != 0){
        echo $counter[2];
        if($counter[3] != 0){
          echo $counter[3];
        }else{
          echo 'error! $counter[3] is: ' . $counter[3];
        }
      }else{
        echo 'error! $counter[2] is: ' . $counter[2];
      }
    }else{
      echo 'error! $counter[1] is: ' . $counter[1];
    }
  }else{
    echo 'error! $counter[0] is: ' . $counter[0];
  }

}
enumurate();
function ($guess) use ($random_password) {
    if ($guess === $random_password) return 2; // it is correct!
    if (substr($random_password, 0, strlen($guess)) === $guess) return 1; // partial match;
    return 0; // the password does not start with the guessed characters
}
有了这种设置,挑战就更有趣了,因为解决方案将不允许偷看它需要猜测的密码

下面是递归解决方案(按照您的函数生成随机密码):

函数getRandomPassword(){//您的函数
$random_password=“”;
$charset=“abcdefghijklmnopqrstuvxyzabefghijklmnopqrstuvxyzo123456789”;
对于($i=0;$i<4;$i++){
$random_int=mt_rand();
$random_password.=$charset[$random_int%strlen($charset)];
}
返回$random_密码;
}
函数findPassword($evaluateGuess){
$charset=str_split(“abcdefghijklmnopqrstuvxyzabcdefghijklmnopqrstuvxyzo123456789”);
函数猜测列表(&$evaluateGuess,&$charset,$password){
$match=$evaluateGuess($password);//调用回调函数
if($match==0)返回;//不匹配
if($match==2)返回$password;//所有字符都正确
foreach($charset as$char){//将每个字符作为“猜测”
$guess=guestrest($evaluateGuess,$charset,$password.$char);
if($guess)返回$guess;
}
}
返回猜测列表($evaluateGuess,$charset,“”);
}
$random_password=getRandomPassword();
echo“要猜测的密码是:$random\u password\n”;
$guess=findPassword(函数($guess)使用($random\u密码){
如果($guess==$random\u password)返回2;//正确!
if(substr($random_password,0,strlen($guess))==$guess)返回1;//部分匹配;
返回0;//密码不以猜测的字符开头
});
echo“猜测的$guess\n”;

继续看。

你猜是什么意思?生成所有可能的密码?我的意思是程序有一个变量
$random\u password
,那么有什么好猜测的呢?关键是我必须生成一个随机密码,然后对生成的密码进行排序“bruteforce”。你说的“bruteforce”是什么意思?是
返回$random\u密码猜起来不够好?就像在电视上:)
function ($guess) use ($random_password) {
    if ($guess === $random_password) return 2; // it is correct!
    if (substr($random_password, 0, strlen($guess)) === $guess) return 1; // partial match;
    return 0; // the password does not start with the guessed characters
}
function getRandomPassword() { // Your function
    $random_password = "";
    $charset = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
    for($i = 0; $i < 4; $i++){
        $random_int = mt_rand();
        $random_password .= $charset[$random_int % strlen($charset)];
    }
    return $random_password;
}

function findPassword($evaluateGuess) {
    $charset = str_split("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789");

    function guessTheRest(&$evaluateGuess, &$charset, $password) {
        $match = $evaluateGuess($password); // call the callback function
        if ($match === 0) return; // mismatch
        if ($match === 2) return $password; // all characters correct
        foreach ($charset as $char) { // taking each character as a "guess"
            $guess = guessTheRest($evaluateGuess, $charset, $password . $char);
            if ($guess) return $guess;
        }
    }

    return guessTheRest($evaluateGuess, $charset, "");
}

$random_password = getRandomPassword();
echo "The password to guess is: $random_password\n";

$guess = findPassword(function ($guess) use ($random_password) {
    if ($guess === $random_password) return 2; // it is correct!
    if (substr($random_password, 0, strlen($guess)) === $guess) return 1; // partial match;
    return 0; // the password does not start with the guessed characters
});

echo "guessed $guess\n";