#!/usr/bin/perl

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

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

$filename = $ARGV[0];

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

$pmax = 0;
$kmax = 0;
$cpos = 0;
%cmax = ();

for ($keylen=2; $keylen<=20; $keylen++) {

  printf("Checking key length of %2d: ", $keylen);

  %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) == 0) {
          if ($chars{$char}) { $chars{$char} += 1; } else { $chars{$char} = 1; }
        }
        $keypos++;
      }
    }
  }

  ## output result
  $min = $chars{(sort {$chars{$a} <=> $chars{$b}} keys %chars)[0]};
  $max = $chars{(sort {$chars{$b} <=> $chars{$a}} keys %chars)[0]};
  $minp = $min/$keypos*$keylen*100;
  $maxp = $max/$keypos*$keylen*100;
  printf("min %3d, max %3d ( %5.2f \% ) --> %5.2f - %5.2f = %5.2f \%\n", $min, $max, ($min/$max*100), $maxp, $minp, ($maxp-$minp));
  if (($maxp-$minp) > $pmax) {
    $pmax = $maxp-$minp;
    $kmax = $keylen;
    %cmax = %chars;
    $cpos = $keypos;
  }
}

print "\nThe key length seems to be: $kmax.\n";
