#!/usr/bin/perl ## vigenere analzysis tool # (c) 2012 F00L.DE # by Rup0rt ## check for arguments # 1 - FILENAME if (!defined $ARGV[0]) { print "Usage: $0 \n"; exit(1); } $filename = $ARGV[0]; open(FILE, $filename); @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= 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";