Vengono presentati due metodi scritti in Java che agevolano il crittoanalista nella individuazione dei trigrammi che si ripetono nel testo cifrato. Il metodo kasiskiAttack restutuirà la lista dei trigrammi ripetuti più di una volta con le loro rispettive distanze; sarà compito del crittoanalista poi dedurre la lunghezza della parola chiave dopo aver analizzato la scomposizione in fattori primi delle distanze. Il metodo splitCyphertext divide semplicemente il testo per colonne, una volta conosciuta la parola chiave così da permettere una semplice analisi statistica sugli n cifrari monoalfabetici (con n=lunghezza parola chiave). Questi metodi erano inseriti nel codice di una applet java*/
//metodo per il calcolo della lunghezza della parola chiave basandosi sulle distanze dei trigrammi ripetuti nel testo
public void kasiskiAttack(String input) { Vector trigramList = new Vector();
String trigram;
// abbiamo bisogno di almeno 3 caratteri di testo cifrato if( input.length() < 3 )
return;
// analizza tutti i trigrammi del testo cifrato for( int i = 0; i < input.length()-2; ++i ) { trigram = input.substring( i, i+3 );
//se un trigramma si ripete più di una volta inseriscilo in una lista if( input.indexOf(trigram,i+1) != -1 ) {
if( trigramList.indexOf(trigram) == -1 ) trigramList.addElement(trigram);
} }
//analizza la lista dei trigrammi ripetuti e calcolane le occorrenze e le distanze for( int i = 0; i < trigramList.size(); ++i ) {
trigram = (String)trigramList.elementAt(i);
int count = 0;
// costruisci un’array delle posizioni dei trigrammi
int[] posArray = new int[countOccurrences(input,trigram)];
int index = input.indexOf(trigram);
while( index != -1 ) {
posArray[count++] = index;
index = input.indexOf(trigram, index+1);
}
// stampa il numero delle volte che si presenta un trigramma ed a che punto output.append( trigram + ": occurs " + count + " times, at pos " );
for( int j = 0; j < count; ++j )
output.append( (j==0?"":", ") + posArray[j] );
output.append( "\n distance(s): " );
// ora stampa la distanza fra i trigrammi uguali del testo for( int j = 0; j < count; ++j ) {
for( int k = j+1; k < count; ++k )
output.append( (j==0&&k==1?"":", ") +
(posArray[k]- posArray[j]) );
}
output.append( "\n" );
}
output.append( "\n" );
}
// divide il testo cifrato in pezzi sulla base della lunghezza della chiave public void splitCyphertext(String input, int keyLen) {
if( keyLen <= 0 )
return;
// crea un array di n stringhe vuote con n = lunghezza della chiave String[] strs = new String[keyLen];
for( int i = 0; i < keyLen; ++i ) strs[i] = "";
// analizza tutte le lettere del testo e suddividile in parti for( int i = 0; i < input.length(); ++i )
strs[i%keyLen] += input.charAt(i);
// stampale
for( int i = 0; i < keyLen; ++i )
output.append( "KeyPos=" + i + ": " + strs[i] + "\n" );
output.append( "\n" );
}