#native_company# #native_desc#
#native_cta#

Generating Pronounceable Passwords Page 2

By Jess Castagnetto
on July 30, 2000

I used the first 300 lines of the /usr/dict/words file in my
Solaris box and save them into the file mywords,
you can use any list of words you would like. Also, if you
desire to have a better random generator, use the Mersenne Twister functions
(see the manual entries for
mt_rand()
and
mt_srand()
for their description and links to more information).

Creating a function

Of course, we can make all of this into a function that you can drop in your
scripts:
List 2: function ppassgen()

<?php

/*

 * Pronounceable password generator

 * version 1.0 - made into a function

 * Inspired by a question made by: georgcantor_at_geocities.com

 * in the PHPBuilder discussion forum

 * (c) Jesus M. Castagnetto, 1999

 * GPL'd code, see www.fsf.org for more info

 */

/*

 * function ppassgen()

 * parameters:

 * $words = the name of the file w/ the words (one per line)

 *      or and array of words

 * $min = the minimum number of words per password

 * $max = the maximum number of words per password

 * $cutoff = the minimum number of characters per word

 * $sep = separator for the words in the password

 */

function ppassgen($words"mywords"$min=2$max=4$cutoff=5$sep"_") {

    if(is_array($words)) {

        
/* if we have passed and array of words, use it */

        
$word_arr =  "words";

         
/*

        while(list($k,$v) = each(${$word_arr})) {

            echo "$k $v<BR>";

        }

        */

    
} else {

        
/* read the external file into an array */

        
$fp fopen($words"r");

        if (!fp) {

            echo  
"[ERROR}: Could not open file $words<BR>n";

            exit;

        } else {

            
/* assuming words of up to 127 characters */

            
$word_arr =  "ext_arr";

            while(!
feof($fp)) {

                
$tword trim(fgets($fp,128));

                /* check for minimum length and for exclusion of numbers */

                
if ((strlen($tword) >= $cut_off) && !ereg"[0-9]",$tword)) {

                    
$ext_arr[] = strtolower($tword);

                }

            }

            
fclose($fp);

        }

    }

    /* size of array of words */

    
$size_word_arr count(${$word_arr});

    /* generate the password */

    
srand((double)microtime()*1000000);

    /* or use the Mersenne Twister functions */

    //mt_srand((double)microtime()*1000000);

    /* for a password of a fixed word number, min = max */

    $n_words = ($min == $max)? $min rand($min,$max);

    /* or use the Mersenne Twister for a better random */

    //$n_words = ($min == $max)? $min : mt_rand($min,$max);

    for ($i=0$i<$n_words$i++) {

        
$pass .= ${$word_arr}[rand(0,($size_word_arr 1))] . $sep;

    }

    
/* return the password minus the last separator */

    
return substr($pass,0,-1*strlen($sep));

}

/* test the function */

/* generate 10 passwords using the default */

for ($j=0$j 10$j++) {

    echo 
ppassgen() .  "<BR>n";

}

/* change some paramaters and use our own separator */

echo  "<HR>n";

echo 
ppassgen"mywords",3,4,7"**") .  "<BR>n";

/* give our own array to the function and generate a 2 word password */

$nwords = array( "cat""mouse""dog""house""surfboard""kirima");

echo 
ppassgen($nwords,2,2,3) . "<BR>n";

?>