# Depth-first search
# Max length = 20
1234
1234a
1234aa
1234aaa
1234aaaa
...
1234aaaaaaaaaaaaaaaa
1234b
1234bb
...
####
# Breadth-first search
1234
1234a
1234b
1234c
...
12348
12349
1234aa
1234ab
1234ac
...
####
use strict;
use warnings;
sub crack {
my $hint = shift;
my $target = shift;
my $salt = substr($target, 0, 2);
my @chars = @_;
my @to_process = ( '' );
my $passwd;
while (@to_process) {
my $pad = shift(@to_process);
push(@to_process, $pad . $_)
foreach @chars;
for my $pos (0..length($pad)) {
$passwd = $pad;
substr($passwd, $pos, 0, $hint);
return $passwd
if crypt($passwd, $salt) eq $target;
}
}
}
my @chars = ('a'..'z', 'A'..'Z', '0'..'9');
print crack('12', crypt('d12e', 'AA'), @chars), "\n";
print crack('1234', crypt('aa12345', 'AA'), @chars), "\n";