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. |