C++ Rätsel
-
Hallo im folgenden Quelltext ist der Key gesucht:
(Der Text ist von einer Stellenausschreibung einer Softwarefirma)void decrypt(char* secret, char* key) { char c; char *k = key; while((c = *secret) !=0 ) { *secret++ = (c-32) - ((*k)-64) + 32; k = *(k+1) ? k+1 : key; } } char *key = "????????"; char secret[100]; strcpy(secret, "ZJ]]_Y2ec%_hXH]P\\%k_eS2OSW4n\] f+RJincNUS.QU_eLW].Ngn7F^^.IYl7XUSZZYmjJ^"); decrypt(secret,key); cout << "GEHEIME BOTSCHAFT: " << secret << endl;
Keine Ahnung ob das so falsch gedruckt wurde, oder sonst was, aber müsste da nicht eine main-Funktion sein? Weil so lässt sich das nicht bei mir übersetzen.
Also hab ichs in folgende Form gebracht:#include <string.h> #include <iostream> #include <ostream> void decrypt(char* secret, char* key){ char c; char *k = key; while((c = *secret) !=0 ){ *secret++ = (c-32) - ((*k -64)+32; // das ist entspricht: *secret++ = c - (*k) +64; k = *(k+1) ? k+1 : key; } } int main(){ char *key = "????????"; char secret[100]; strcpy(secret,"ZJ]]_Y2ec%_hXH]P\\%k_eS2OSW4n\]f+RJincNUS.QU_eLW].Ngn7F^^.IYl7XUSZZYmjJ^"); decrypt(secret,key); std::cout << "GEHEIME BOTSCHAFT: " << secret << std::endl; }
Was man sofort erkennt ist dass der Key aus 8 Zeichen besteht, das wars aber auch schon, für mich zumindest.
Die Frage ist wie fängt man überhaupt an? Der Key ist ja offensichtlich unbekannt und vom Klartext weiss man auch nichts, ausser die länge.
Hat jemand ne Ahnung?
Danke
-
Novio schrieb:
Die Frage ist wie fängt man überhaupt an? Der Key ist ja offensichtlich unbekannt und vom Klartext weiss man auch nichts, ausser die länge.
Das ist in einer Nacht zu schaffen. Bei der Häufigkeitsanalyse nimmst Du Dir jedes Schlüsselzeichen einzeln vor.
http://de.wikipedia.org/w/index.php?title=Datei:English-slf.png&filetimestamp=20060203184049
http://www.google.de/#hl=de&source=hp&q=%2BRJincNUS&fp=3adf45ab21e561ef
-
Bringt die Häufigkeitsanalyse denn was? Nur jede 8. Buchstabe wird mit dem selben Key verschlüsselt,das heisst man hat sozusagen nur 8 Bit, die man zur Analyse zu Verfügung hat, das ist doch viel zu wenig. Ausserdem ist die Sprache des Klartextes unbekannt.
Gibt es sonst noch eine Möglichkeit?
-
ich wollte mich heut nacht eigtl auch mal kurz ransetzen - erschien mir dann aber auch aussichtslos.
man kann weder mit bestimmten reihenfolgen noch mit der häufigkeitsanalyse iwas anstellen, für das eine ist der text zu kurz und das andere kann man nicht, weil der verschl.-algo nur jeden 8. buchstaben gleich verschlüsselt.das einzige, was mir eingefallen war(als dann die lust aber schon nicht mehr da war :D), dass man sich ja einfach mal die werte ausgeben lassen kann und guckt, was man abziehen muss, damit man nen buchstaben bekommt.
ich würd mir vermutlich die zeichen aufschreiben, durch die man A-Z, a-z und 0-9 + leerzeichen und paar satzzeichen bekommt - und hoffen, dass sich durch die 8 vorkommen irgendwo genug eingrenzt.bb
-
Dann teile doch das zu Entschlüsselnde in 8er Blocks auf und untersuche die Blöcke entsprechend einzeln.
Dann achte auch mal genau darauf was da aufaddiert, subtrahiert wird und schau mal in eine ASCII Tabelle
-
Die Aufgabe ist lösbar, indem man (wie gesagt) für jedes Zeichen des Schlüssels durchprobiert und schaut, ob ein sinnvoller Lösungssatz (d. h. bestehend aus Buchstaben und Leerzeichen) entsteht. Für folgende Lösung habe ich etwa 30 Minuten gebraucht plus ein wenig für Verschönerungen, damit ich es hier posten kann.
#include <iostream> #include <vector> #include <string> using namespace std; void decrypt(char* secret, const char* key) { char c; const char *k = key; while((c = *secret) !=0 ) { // *secret++ = (c-32) - ((*k)-64) + 32; *secret++ = c - *k + 64; k = *(k+1) ? k+1 : key; } } bool isMessageChar(char c) { return (c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z') || (c == ' ') ; } void get_possible_keys(const string &secret, size_t keySize, vector<vector<char> > &keys) { static const char * const PossibleKeyChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" "abcdefghijklmnopqrstuvwxyz" "0123456789" " " ; const char * const PossibleKeyChars_End = PossibleKeyChars + strlen(PossibleKeyChars); keys.resize(keySize); for (size_t i = 0; i < keySize; ++i) { for (const char *k = PossibleKeyChars; k != PossibleKeyChars_End; ++k) { bool found = true; for (size_t s = i; s < secret.size(); s += keySize) { if (!isMessageChar(secret[s] - *k + 64)) { found = false; break; } } if (found) { keys[i].push_back(*k); } } } } int main() { const size_t keyLength = 8; //"????????" const string secret = "ZJ]]_Y2ec%_hXH]P\\%k_eS2OSW4n\]f+RJincNUS.QU_eLW].Ngn7F^^.IYl7XUSZZYmjJ^"; vector<vector<char> > keys; get_possible_keys(secret, keyLength, keys); cout << "Moegliche Zeichen fuer den Schluessel:" << endl; for (size_t i = 0; i < keys.size(); ++i) { cout << i << " "; for (size_t j = 0; j < keys[i].size(); ++j) { cout << keys[i][j]; } cout << endl; } while (true) { string key; cout << "Key testen: "; getline(cin, key); if (key.empty()) { break; } char buffer[100]; strcpy(buffer, secret.c_str()); decrypt(buffer, key.c_str()); cout << "GEHEIME BOTSCHAFT: " << buffer << endl; } }
Moegliche Zeichen fuer den Schluessel: 0 N 1 E 2 T123 3 EFGTUVWXYZ456789 4 W0123456 5 CDE 6 R01 7 K Key testen: NETZWERK GEHEIME BOTSCHAFT: LEICHT ZU KNACKEN WENN DER TEXT DEUTLICH LAENGER IST ALS DER SCHLUESSEL