PHP暴力密码生成器

时间:2011-08-11 18:55:18

标签: php passwords generator brute-force

我希望能够输入一个数字并获取一个密码,这个密码是用字符串或唯一字符构建的。所以如果我在字符串中有两个字符:$ string =“AB”;这些都是理想的结果:

-in-|-out-
 0  |  A
 1  |  B
 2  | AA
 3  | AB
 4  | BA
 5  | BB
 6  | AAA
 7  | AAB
 8  | ABA
 9  | ABB
 10 | BBB

等等。这是我目前的代码:

for($i = 1; $i < 100; $i++)
{
    echo createString ($i, "AB")."<br/>";
}
function createString ($id, $chars) // THE ISSUE <---
{
    $length = getLength($id, $chars);
    //echo "LENGTH : ".$length."<br/><br/>";
    $string = "";
    for($i = 0; $i < $length; $i++)
    {
        $a = round(($id - 1)/pow($length, $i)); // THE ISSUE <-----
        $local = local($a, strlen($chars));
        $string = $chars{$local - 1}." : ".$string;
    }
    return $string;
}
function local ($num, $max)
{
    $num += $max;
    while($num > $max)
    {
        $num -= $max;
    }
    return $num;
}
/*
 get the length of the output by inputing the "in" and defining the possible characters
*/
function getLength ($id, $chars)
{
    $charNUM = 1;
    $LR = -1;
    $HR = 0;
    while(true)
    {
        $LR = $HR;
        $HR = pow(strlen($chars), $charNUM) + $LR;
        $LR += 1;
        //echo $LR." : ".$HR." : ".$charNUM."<br/>";
        if($id >= $LR && $id <= $HR)
        {
            return $charNUM;
        }
        if($id < $LR)
        {
            return false;
        }
        $charNUM ++;
    }
}

输出:

B : 
A : 
A : B : 
B : A : 
B : B : 
A : A : 
A : B : B : 
A : B : A : 
A : A : B : 
A : A : A : 
A : A : B : 
A : B : A : 
A : B : B : 
A : B : A : 
B : A : B : B : 
B : A : B : A : 
B : A : B : B : 
B : A : B : A : 
B : A : A : B : 
B : A : A : A : 
B : A : A : B : 
B : A : A : A : 
B : A : B : B : 
B : A : B : A : 
B : B : B : B : 
B : B : B : A : 
B : B : A : B : 
B : B : A : A : 
B : B : A : B : 
B : B : A : A : 
B : B : A : B : B : 
B : B : A : B : A : 
B : B : A : B : B : 
B : B : A : A : A : 
B : B : A : A : B : 
B : B : A : A : A : 
B : B : A : A : B : 
B : B : A : A : A : 
B : B : B : B : B : 
B : B : B : B : A : 
B : B : B : B : B :

等等。但它重复了一遍。我遇到了函数createString()的问题。我想在没有预先计算的情况下在暴力密码表的某处访问密码。我不想要一个预先计算好的数组,只需访问它的一个点。

3 个答案:

答案 0 :(得分:4)

我将在这里发布用于将任何正整数转换为任何给定正整数基(> 1)的系统的代码,返回每个数字的值。

function convert($number, $base)
{
        $return = array();
        do{
                $return[] = $number % $base;
                $number = floor($number / $base);
        }while($number != 0);
        return $return;
}

所以你打电话使用这个函数如下:

function createString($i, $base)
{
        $res = convert($i, strlen($base));
        $str = "";
        foreach($res as $digit)
        {
                $str = $base[$digit] . $str;
        }
        return $str;
}

试一试。它的格式与输出略有不同,但应该是可读的。

基础“AB”的一些expamle输出:

0 -> A    
1 -> B
2 -> BA
3 -> BB
4 -> BAA
5 -> BAB
6 -> BBA
7 -> BBB
8 -> BAAA
9 -> BAAB
10-> BABA
11-> BABB
12-> BBAA
13-> BBAB
14-> BBBA
15-> BBBB

答案 1 :(得分:3)

良好的旧递归

$string = "AB";
$characters = str_split($string, 1);

function mutate ($characters, $count) {
  var_dump($characters);

  if (!$count) return $characters;

  $result = $tmp = mutate($characters, $count -1);

  foreach ($characters as $char) {
    foreach ($tmp as $current) {
      $result[] = $current . $char;
    }
  }
  return $result;
}

答案 2 :(得分:1)

解决方案:

function id_encode($id, $chars) {
    $len = strlen($chars);
    $i = 1;
    $str = array();
    while ($id >= 0) {
        $str[] = $chars[ $id / pow($len, $i - 1) % $len ];
        $id -= pow($len, $i);
        $i++;
    }
    return strrev(implode('', $str));
}
function id_decode($str, $chars) {
    $len = strlen($chars);
    $chars = array_flip(str_split($chars));
    $strs = str_split(strrev($str));
    $i = 0;
    foreach ($strs as $key => $char) {
        if (!$i) {
            $id = $chars[ $char ];
        }
        else {
            $id += pow($len, $i) * ($chars[ $char ] + 1);
        }
        $i++;
    }
    return $id;
}

示例:

$chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_';

$id = 42599293;

$string = id_encode($id, $chars);
echo 'id:          ' . $id . PHP_EOL;
echo 'id_encode(): ' . $string . PHP_EOL;
echo 'id_decode(): ' . id_decode($string, $chars) . PHP_EOL;

输出:

id:          42599293
id_encode(): bHFm9
id_decode(): 42599293

示例2:

$chars = 'AB';
$len = strlen($chars);

for ($i = 0; $i < 50; $i++) {
    if ($i) {
        if (!($i % $len)) {
            echo PHP_EOL;
        }
        else {
            echo ', ';
        }
    }
    $str = id_encode($i, $chars);
    $id = id_decode($str, $chars);
    echo $i . '=' . $str . '=' . $id;
}

输出2:

0=A=0, 1=B=1
2=AA=2, 3=AB=3
4=BA=4, 5=BB=5
6=AAA=6, 7=AAB=7
8=ABA=8, 9=ABB=9
10=BAA=10, 11=BAB=11
12=BBA=12, 13=BBB=13
14=AAAA=14, 15=AAAB=15
16=AABA=16, 17=AABB=17
18=ABAA=18, 19=ABAB=19
20=ABBA=20, 21=ABBB=21
22=BAAA=22, 23=BAAB=23
24=BABA=24, 25=BABB=25
26=BBAA=26, 27=BBAB=27
28=BBBA=28, 29=BBBB=29
30=AAAAA=30, 31=AAAAB=31
32=AAABA=32, 33=AAABB=33
34=AABAA=34, 35=AABAB=35
36=AABBA=36, 37=AABBB=37
38=ABAAA=38, 39=ABAAB=39
40=ABABA=40, 41=ABABB=41
42=ABBAA=42, 43=ABBAB=43
44=ABBBA=44, 45=ABBBB=45
46=BAAAA=46, 47=BAAAB=47
48=BAABA=48, 49=BAABB=49

id_encode()的信用额转到@PatrickLorio。 id_decode()由我自己建造,先用手计算: enter image description here

之后我认为可以通过获取id的第n个根来优化id_encode() ...也许我找时间来检查它。