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