#!/usr/local/bin/perl $USAGE = " SYNOPSIS: generate a random string for passwords USAGE: mkpw LENGTH LEVEL NUMPASS Notes: LENGTH >0 or 4 default GPL(C) 1999-11-27 http://www.cs.albany.edu/~mosh "; my $pwlen = shift; $pwlen = 4 if $pwlen < 4; my $level = shift || 1; my $numpw = shift || 1; my @pwchar1 = split( //, "bcdfghjklmnpqrstvwxyz"); my @pwchar2 = split( //, "/=-.;" ); my @pwchar3 = split( //, "aeiou"); my @pwchar4 = split( //, "0123456789"); my $kindex = 0; my $krandom = "$ENV{HOME}/knuth/krandoms"; my @krandom; if( open( RAND, $krandom ) ){ @krandom = ; foreach( @krandom ){ chomp; } close RAND; }else{ warn " Cannot read krandom file=$krandom. krandom generator derived from Knuth's http://Sunburn.Stanford.EDU/~knuth/programs/rng.c or follow this link http://www-cs-faculty.Stanford.EDU/~knuth\n"; srand( reverse (time()+ $$) ) ; # broken srand, size of seed matters. rand(); # something wrong with first call to rand? } while( $numpw-- ){ print mkpw($pwlen),"\n"; } # end of main. # ZZ: Windows/perl/rand: call less then than once/second. # srand( reverse (time()+ $$) ) ; # broken srand, size of seed matters. # rand(); # something wrong with first call to rand? sub mkpw { my $pwlen = shift || 4; my @otpw; my($i); for( $i = 0; $i < $pwlen/2 ; $i++ ){ push( @otpw, $pwchar1[ krandom($#pwchar1) ] ); push( @otpw, $pwchar2[ krandom($#pwchar2) ] ) if $level > 2; push( @otpw, $pwchar3[ krandom($#pwchar3) ] ) unless $level > 2; push( @otpw, $pwchar3[ krandom($#pwchar3) ] ) if $level > 1; } for( $i = 0; $i < 1 ; $i++ ){ push( @otpw, $pwchar2[ krandom($#pwchar2) ] ); } for( $i = 0; $i < 2 ; $i++ ){ push( @otpw, $pwchar4[ krandom($#pwchar4) ] ); } return join('',@otpw); } sub krandom { my $max = shift; my $val; $max++; if( $#krandom ){ $kindex += 1 + time(); $val = $krandom[ $kindex % $#krandom ] % $max; # warn "ki=$kindex,max=$max,val=$val,kmax=$#krandom\n"; }else{ $val = rand($max); } return $val; }