PHP force brute générateur de mot de passe

Je veux être en mesure d'entrer un numéro et un mot de passe, construite à partir d'une chaîne de caractères ou des caractères uniques. Donc, si j'ai deux caractères dans la chaîne : $string = "AB"; ce sont les résultats souhaités :

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

Et ainsi de suite. Voici mon code actuel :

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

Que les sorties :

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 :

Et ainsi de suite. Mais il a des répétitions. Je vais avoir des problèmes avec la fonction createString(). Je veux accéder à un mot de passe quelque part en bas de la force brutale mot de passe de la table sans l'avoir pré-calculé. Je ne veux pas d'une pré-calculés tableau et d'accéder simplement à un point.

pas de répéter comme ça, mais il retourne la même pense, par exemple: AAA et AAA, AAA = AAA
Puis-je droit: Vous voulez rendre un certain Nombre dans un système où vous définissez vos chiffres par l'intermédiaire d'une chaîne. Donc la base de votre système serait la longueur de la chaîne et de la i-ième digit le char à la i-ème position dans la chaîne?
c'est l'idée. dans le code où j'ai la balise //<- la QUESTION est de savoir où est compilé.
Vous devriez poster votre solution comme une réponse et de l'accepter.
Votre solution me donne(ideone.com/Fh4tR): A, B, BA, BB, AA, AB, ABA, ABB, AAA, BAB, BBA, BBB ... de sorte qu'il semble ne pas s'adapter à votre sortie désirée.

OriginalL'auteur Patrick Lorio | 2011-08-11