Problem 59: XOR Entschlüsselung

Gesucht wird die Summe der ASCII-Werte aller Zeichen eines XOR-kodierten Textes! [das englische Original]

Für die Lösung dieses Problems gab es noch zwei wichtige Einschränkungen:

  1. Das Codewort besteht aus drei Kleinbuchstaben!
  2.  Der Text entstammt der englischen Sprache!

Glücklicher Weise durfte ich ähnliche Probleme bereits während meines Studium am HPI lösen. Im Rahmen des „Security Labs“ hatte ich gelernt, dass jede Sprache eine bestimmte Verteilung aller Buchstaben hat. Somit brauchte ich nur noch alle Kombination der Buchstaben von „aaa“ bis „zzz“ als Codewort anwenden, um den Ergebnistext mit der besten Verteilung (also der geringsten Differenz zur Standardverteilung der englischen Sprache) als Lösung zu finden:

@Override
public String solve() {

   double best = Double.MAX_VALUE;
   byte[] found = new byte[ 0 ];
 
   for( byte a=97; a<123; a++ ) {
      for( byte b=97; b<123; b++ ) {
         for( byte c=97; c<123; c++ ) {
            byte[] key = new byte[]{ a, b, c };
            byte[] text = decode( code, key );
            double[] curDist = getLetterDist( text );
 
            double sum = 0.0;
            for( int i=0; i<26; i++ ) {
               sum += Math.pow( StandardDistribution[ i ] - curDist[ i ], 2 );
            }
            sum = Math.sqrt( sum );
 
            if( sum < best ) {
               best = sum;
               found = text;
               IO.infoln( "found new best[ " + sum + " ] for key[ " + new String( key ) + " ] decoded: " + new String( found ) );
            }
         }
      }
   }
 
   int result = 0;
   for( byte f : found ) {
      result += f;
   }
 
   return IO.i2s( result );
}

Den vollständigen Quellcode der Klasse für die Lösung des Problems 59 kann man sich hier anschauen!

<< Problem 58 Übersicht Problem 60 >>

Willkommen in Nico Dannebergs Netzwerk

%d Bloggern gefällt das: