#!/usr/bin/perl

## vigenere crack tool
# (c) 2012 F00L.DE 
# by Rup0rt <roport at f00l dot de>

## check for arguments
# 1 - FILENAME
# 2 - KEY LENGTH
if (!defined $ARGV[1]) {
  print "Usage: $0 <filename> <keylen>\n";
  exit(1);
}

$filename = $ARGV[0];
$keylen = $ARGV[1];

$maxletter = 'e';	# this is very important... e is max letter for english texts

$key = "";

open(FILE, $filename);
@file = <FILE>;
close(FILE);

for ($pos=0; $pos<$keylen; $pos++) {

  printf("CRACKING position %3d: ", $pos+1);

  %chars = ();
  $keypos = 0;

  foreach $line (@file) {
    for ($i=0;$i<length($line);$i++) {
      $char = lc substr($line, $i, 1); 	# LOWERCASE ONLY(!!)

      # just count ascii chars
      if ((ord($char) >= 97) && (ord($char) <= 122)) {
        if (($keypos % $keylen) == $pos) {
          if ($chars{$char}) { $chars{$char} += 1; } else { $chars{$char} = 1; }
        }
        $keypos++;
      }
    }
  }

  $max = (sort {$chars{$b} <=> $chars{$a}} keys %chars)[0];
  $keyord = ((ord($max)-ord($maxletter)) % 26) + 97;
  $key = $key . chr($keyord);
  printf("%3d = %s\n", $keyord, chr($keyord));
}

print "\nCRACKED password: $key\n";
