#!/opt/Summertime_98.sparc/Perl/bin/perl

#
# Beschreibung:
#
#    kasiski <file>
#
# kasiski fuehrt die notwendige Auswertung fuer den Kasiski-Test fuer
# Vigenere-Entschluesselungs-Attacken durch.
#
# Fuer jedes Teilwort der Laenge mindestens drei, welches in dem Text
# zweimal vorkommt, wird dieses Teilwort zusammen mit dem Abstand 
# ausgegeben. Kommt ein Teilwort dreimal vor, so erscheint es in der
# Liste zweimal.
#

$lflag = 0;

$l_0 = 3;

for ( $i = 0 ; $i <= $#ARGV ; $i++ )
{
        if ( $ARGV[$i] =~ /^-/ )
        {
                if ( $ARGV[$i] =~ /^-[l]/ )
                {
                        $lflag = 1;
			$l_0 = substr( $ARGV[$i], 2, 1 );
			if ( $l_0 !~ /^[0-9]/ ) 
			{
				if ( ( $l_0 = substr( $ARGV[$i+1], 0, 1 )) =~ /^[0-9]/ )
				{
					for ( $j=$i+1 ; $j < $#ARGV ; $j++ )	
					{
						$ARGV[$j] = $ARGV[$j+1];
					}
					pop(@ARGV);
				}
			}
		}
                        
                for ( $j=$i ; $j < $#ARGV ; $j++ )
                {
                        $ARGV[$j] = $ARGV[$j+1];
                }
                pop(@ARGV);
        }
}

unless ( $l_0 >= 3 )
{
	$l_0 = 3;
}


$file = '';

while (<>)
{
	tr /A-Z/a-z/;
	tr/a-z/_/c;
	
	$file .= $_;
}	


$file =~ s/_+/_/g;

#print $file;

$_ = $file;

$laenge = tr/a-z//;

$matchcount = 0;
$l = $l_0 -1 ;

do
{
	$success = 0;
	$l++;

	for ( $i = 0; $i <= $laenge - $l ; $i++ )
	{
		$kette = substr($file , $i, $l);
		
		if ( $kette =~ /[a-z]{$l}/ )
		{
			if ( ( $naechstes = index($file, $kette, $i + 1) )  >=  0 )
			{
				$success = 1;
				$matchcount++;
				$Doubles[$matchcount] = $kette;
				$voller_Abstand = $naechstes - $i;

				$_ = substr( $file, $i, $voller_Abstand );

				$Distance[$matchcount] = tr/[a-z]//;
			}
		}
	}
}
while ( $success );

for ( $i = 1; $i <= $matchcount ; $i++ )
{
	printf "%13s  %7d\n", 
		 $Doubles[$i], $Distance[$i];
}

