Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » Rätselecke » Erstes Sonntags(samstags-)rätsel 2003

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
04.01.2003, 18:05 Uhr
NemoEimi



Ein in englischer Sprache abgefasster Text wurde durch Anwendung der folgenden Operationen verschlüsselt:

1. Entfernung aller Leer-, Sonder- und Interpunktionszeichen
2. Umwandlung sämtlicher übrigbleibender Zeichen in Großbuchstaben des üblichen 26-buchstabigen Alphabets
3. Ersetzung der Großbuchstaben durch andere solche gemäß einer geheimen Substitutionstabelle (die einer Permutation der 26 Buchstaben des Alphabets entspricht)

Man schreibe ein Programm, das den letzten Schritt einer solchen Verschlüsselung umkehren kann, wenn nur der verschlüsselte Text gegeben ist. Statistische Informationen über die englische Sprache soll das Programm aus einer im selben Verzeichnis liegenden Datei mit dem Namen "sample.txt" extrahieren (ich werde dazu den unter www.constitution.org/mac/prince.txt downloadbaren Text verwenden), Testfall wird ein verschlüsselter Text mit ca. 1000 Buchstaben Länge sein, gewonnen hat das Programm, das die Aufgabe am schnellsten löst.

Grüße,
NemoEimi
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
05.01.2003, 14:15 Uhr
~0xdeadbeef
Gast


Ist die Substitutionstabelle gegeben?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
05.01.2003, 16:18 Uhr
NemoEimi




Zitat:
~0xdeadbeef postete
Ist die Substitutionstabelle gegeben?


Nein, das Programm soll das angegebene Verschlüsselungsverfahren brechen . Wäre die Substitutionstabelle gegeben, dann wäre es auch sehr leicht, ein Programm zu schreiben, das einen Text der angegebenen Länge in quasi Nullzeit entschlüsselt.
Die Entschlüsselung muss nicht vollständig korrekt sein (das wird man auch für alle Fälle bei sinnvollen Texten der angegebenen Länge wohl nicht garantieren können), aber ein Mensch sollte den ausgeworfenen Entschlüsselungskandidaten gut lesen können.
Hintergrund ist eine unter www.mathematik.uni-muenchen.de/~forster/ueb/2002w/preis2002.ps einsehbare Aufgabe, die ich vor einigen Wochen lösen musste. Dort ist die Beseitigung einer monoalphabetischen Substitution eines der für die Gesamtlösung zu bewältigenden Teilprobleme, und das Programm, das ich damals geschrieben habe, funktioniert auch, aber es ist langsam (es verbraucht über 99 Prozent meiner Gesamtrechenzeit bis zum Auswurf der Lösung), was zum Teil an ineffizient gewählten Datenstrukturen liegt (bei diesem Wettbewerb ging es ja nicht darum, ein schnelles Programm zu produzieren, sondern darum, die Lösung schnell zu finden), aber auch daran, daß mein Programm viel mehr herumprobiert, um das Problem zu lösen, als man das beispielsweise von Hand tun würde. Ich finde die Aufgabe auch deshalb interessant, weil es sicher einigen Spielraum gibt, was das Basteln guter Algorithmen für dieses Problem betrifft.
Ich werde später nochmal einen Text der angegebenen Länge zum Entschlüsseln hier reinstellen als Motivation .

Grüße,
NemoEimi

Dieser Post wurde am 05.01.2003 um 16:36 Uhr von NemoEimi editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
06.01.2003, 19:51 Uhr
NemoEimi



Hier ist nochmal ein Text wie versprochen :

CRTVJGZRNBYJZWNPJORFBVJIVJGBVFNPRVYRZTWNBVONMPRFWYVZ
YRJNOONHRYTZVKTBOKVVDTIOKYOBVJGNITDVZYCOVROKVBOKVUNN
GTZNCOTJOVRRVGLTOKOKVTRMNJVZZNIVOTOMVLTOKWYVZYROKVJ
NMIVMRPOPZKYZONIGFNPWYVZYRLYZYBMTOTNPZTCTOLVRVZNTOLY
ZYURTVDNPZCYPIOYJGURTVDNPZIFKYZWYVZYRYJZLVRVGTOKVRVPJG
VRIVYDVNCMRPOPZYJGOKVRVZOCNRMRPOPZTZYJKNJNRYMIVBYJZNY
RVOKVFYIIKNJNRYMIVBVJWNBVTONZHVYATJWYVZYRZCPJVRYIKVLYZB
FCRTVJGCYTOKCPIYJGEPZOONBVMPOMRPOPZZYFZKVLYZYBMTOTNP
ZYJGMRPOPZTZYJKNJNRYMIVBYJKVKYZMRNPUKOBYJFWYHOTDVZKNB
VONRNBVLKNZVRYJZNBZGTGCTIIOKVUVJVRYIWNCCVRZGTGOKTZTJWY
VZYRZVVBYBMTOTNPZLKVJOKVHNNRKYDVWRTVGWYVZYRKYZLVHOY
BMTOTNJZKNPIGMVBYGVNCZOVRJVRZOPCCFVOMRPOPZZYFZKVLYZY
BMTOTNPZYJGMRPOPZTZYJKNJNRYMIVBYJFNPYIIGTGZVVOKYONJOKV
IPHVRWYITOKRTWVHRVZVJOVGKTBYATJUIFWRNLJLKTWKKVGTGOKRTWV
RVCPZVLYZOKTZYBMTOTNJFVOMRPOPZZYFZKVLYZYBMTOTNPZYJGZ
PRVKVTZYJKNJNRYMIVBYJTZHVYAJNOONGTZHRNDVLKYOMRPOPZZHN
AVMPOKVRVTYBONZHVYALKYOTGNAJNLFNPYIIGTGINDVKTBNJWVJNOL
TOKNPOWYPZVLKYOWYPZVLTOKNIGZFNPOKVJONBNPRJCNRKTBJNLNK
EPGUBVJOOKNPYROCIVGONMRPOTZKMVYZOZYJGBVJKYDVINZOOKVT
RRVYZNJMVYRLTOKBVBFKVYROTZTJOKVWNCCTJKVRVLTOKWYVZYRYJ
GTBPZOHYPZVOTITOWNBVMYWAONBVMPOFVZOVRGYFOKVLNRGNCWY
VZYRBTUKOKYDVZONNGYUYTJZOOKVLNRIGJNLKVITVZOKVRVYJGJNJV
ZNHNNRONGNKTBRVDVRVJWVNKBYZOVRZTCTLVRVGTZHNZVGONZOTR
FNPRKVYROZYJGBTJGZONBPOTJFYJGRYUVTZKNPIGGNMRPOPZLRNJUY
JGWYZZTPZLRNJULKNFNPYIIAJNLYRVKNJNRYMIVBVJTLTIIJNOGNOKVBL
RNJUTRYOKVRWKNNZVONLRNJUOKVGVYGONLRNJUBFZVICYJGFNPOKYJ
TLTIILRNJUZPWKKNJNRYMIVBVJMPOKVRVZYHYRWKBVJOLTOKOKVZVYI
NCWYVZYRTCNPJGTOTJKTZWINZVOOTZKTZLTIIIVOMPOOKVHVNHIVKVY
ROKTZOVZOYBVJOLKTWKHYRGNJBVTGNJNOBVYJONRVYGYJGOKVFLNP
IGUNYJGATZZGVYGWYVZYRZLNPJGZYJGGTHOKVTRJYHATJZTJKTZZYW
RVGMINNGFVYMVUYKYTRNCKTBCNRBVBNRFYJGGFTJUBVJOTNJTOLTOK
TJOKVTRLTIIZMVQPVYOKTJUTOYZYRTWKIVUYWFPJONOKVTRTZZPVKYD
VHYOTVJWVUVJOIVCRTVJGZTBPZOJNORVYGTOTOTZJNORTUKOFNPAJN
LKNLWYVZYRINDVGFNPFNPYRVJNOLNNGFNPYRVJNOZONJVZMPOBVJY
JGMVTJUBVJMVYRTJUOKVLTIINCWYVZYRTOLTIITJCIYBVFNPTOLTIIBYAVF
NPBYGOTZUNNGFNPAJNLJNOOKYOFNPYRVKTZKVTRZCNRTCFNPZKNPIG
NKLKYOLNPIGWNBVNCTO

Grüße,
NemoEimi

Dieser Post wurde am 06.01.2003 um 19:53 Uhr von NemoEimi editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
07.01.2003, 17:09 Uhr
Bruder Leif
dances with systems
(Operator)


Moin!

...erster ;-) Dafür ist der Quelltext hier nur ein Ansatz, das Ermitteln der Substitutionstabelle hat noch viel Spielraum. Entsprechend chaotisch ist der "entschlüsselte" Text


C++:
#include <stdio.h>
#include <stdlib.h>

//------------------------------------------------------------------------------

typedef struct
{
   int iAnzahl;
   char cZeichen;
} TEntry;

//------------------------------------------------------------------------------

void DateiAnalysieren(char* szDatei, TEntry Haeufigkeiten[26])
{
   FILE *fIn;
   int iChar, i;

   // Quelldatei öffnen
   if(!(fIn = fopen(szDatei, "r")))
   {
      printf("Fehler: Datei \"%s\" nicht gefunden\n", szDatei);
      exit(1);
   }

   // Zeichenweise durchgehen und Häufigkeiten hochzählen
   while((iChar = fgetc(fIn)) != EOF)
   {
      if(iChar >= 'a' && iChar <= 'z') Haeufigkeiten[iChar-'a'].iAnzahl++;
      else if(iChar >= 'A' && iChar <= 'Z') Haeufigkeiten[iChar-'A'].iAnzahl++;
   }

   // Datei wieder schließen
   fclose(fIn);
}

//------------------------------------------------------------------------------

int CompareFunc(const void* arg1, const void* arg2)
{
   if(((TEntry*)arg1)->iAnzahl > ((TEntry*)arg2)->iAnzahl) return -1;
   else if(((TEntry*)arg1)->iAnzahl < ((TEntry*)arg2)->iAnzahl) return 1;
   else return 0;
}

//------------------------------------------------------------------------------

int main()
{
   TEntry VerteilungChiffre[26]={0}, VerteilungEnglisch[26]={0};
   char cSubstitution[26];
   FILE *fIn;
   int iChar, i;

   // Häufigkeitstabellen initialisieren
   for(i=0; i<26; i++)
   {
      VerteilungChiffre[ i ].cZeichen = i;
      VerteilungEnglisch[ i ].cZeichen = i;
   }

   // Die Häufigkeitsverteilungen einlesen
   DateiAnalysieren("Chiffre.txt", VerteilungChiffre);
   DateiAnalysieren("Englisch.txt", VerteilungEnglisch);

   // Die Tabellen nach Anzahl der Buchstaben sortieren
   qsort(VerteilungChiffre, 26, sizeof(TEntry), CompareFunc);
   qsort(VerteilungEnglisch, 26, sizeof(TEntry), CompareFunc);

   // Aus den sortierten Tabellen die Substitutionstabelle erstellen
   // Wir gehen einfach davon aus, daß der häufigste Buchstabe aus Text 1 dem
   // häufigsten aus Text 2 entspricht. Keine großen Vergleiche der
   // prozentualen Häufigkeiten!
   // Mögliche Erweiterung: Bi- und Trigrammsuche nach Wortliste, Plausibilitätsprüfung (sechs Konsonanten hintereinander?), ...
   for(i=0; i<26; i++) cSubstitution[VerteilungChiffre[ i ].cZeichen] = 'A' + VerteilungEnglisch[ i ].cZeichen;

   // Substitutionstabelle ausgeben
   for(i=0; i<26; i++) printf("%c -> %c\n", i+'A', cSubstitution[ i ]);

   // Jetzt mit Hilfe der Substitutionstabelle den Text entschlüsseln!
   if(fIn = fopen("Chiffre.txt", "r"));
   while((iChar = fgetc(fIn)) != EOF) if(iChar >= 'A' && iChar <= 'Z') putchar(cSubstitution[iChar-'A']);
   fclose(fIn);
  
   return 0;
}


--
Mit 40 Fieber sitzt man nicht mehr vor dem PC.
Man liegt im Bett.
Mit dem Notebook.

Dieser Post wurde am 07.01.2003 um 17:10 Uhr von Bruder Leif editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
10.01.2003, 18:30 Uhr
NemoEimi




Zitat:
Bruder Leif postete
Dafür ist der Quelltext hier nur ein Ansatz, (...)



Ja... eine Lösung im Sinne der Aufgabenstellung ist das nicht, wenn ich mir den Ergebnistext so ansehe

Grüße,
NemoEimi
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ Rätselecke ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: