Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » Hashfunktion Kollision erzeugen

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
15.06.2018, 08:39 Uhr
Sandra39



Hallo,

ich soll ein Programm erstellen, welches eine Datei einliest und den Hash berechnet. Anschließend soll die Datei verändert werden. Das bedeutet, aus ¤ 100,- mach ¤ 200,-. Auch hier soll der Hash berechnet werden. Das funktioniert soweit. Das Problem ist jetzt, das ich das Markup der veränderten Datei so ändern soll, dass der gleiche Hash herauskommt. Um die Versuche zu reduzieren, soll ich nur die ersten vier Hex-Werte verwenden. Hat jemand eine Idee (Pseudocode), wie sowas zu realisieren ist? Hier die Funktion, die ich bis jetzt habe.




C++:
void Mark_Up(const char *const argv[], mpz_class hash_value2, mpz_class hash_value) {
    cout<<endl;

     ifstream document(argv[1], ios::in);
     string buffer, original;

     ifstream document1(argv[2], ios::in);
     string faelschung, buffer_1;


    while(!document.eof() && document.good()) {                            getline(document, buffer, '\0');                        
        original = original + buffer;
        cout <<original<<endl;
        cout << "Hash - Original: " <<hash_value<<endl;            
        cout <<endl;
     }

     if(document.bad()) {                                    
        cerr<< "Datei konnte nicht geoeffnet werden!"<<endl;
        exit(1);
     }

     while(!document1.eof() && document1.good()) {
        getline(document1, buffer_1, '\0');
        faelschung = faelschung + buffer_1;
        cout <<faelschung<<endl;
        cout << "Hash - Faelschung: " <<hash_value2<<endl;
     }

     if(document1.bad()) {                                            //Der C++ Programmierer, Ulrich Breymann, S. 421
        cerr<< "Datei konnte nicht geoeffnet werden!"<<endl;
        exit(1);
     }
     document.close();
     document1.close();


    //while(hash_value2 != hash_value) {
        //faelschung.erase(remove(faelschung.begin(), faelschung.end(), '\t'), faelschung.end());
        faelschung.erase(23, 1);
        faelschung.erase(29, 1);
        faelschung.erase(30, 1);
        faelschung.erase(29, 1);
        faelschung.erase(52, 1);
        faelschung.erase(52, 1);
        faelschung.erase(70, 1);
        string v = "v";
        string s = "s";
        faelschung.erase(59, 1);
        faelschung.replace(59, 0, s);
        faelschung.replace(70, 0, v);
        faelschung.erase(84, 1);


        const char *const attack = faelschung.c_str();

        cout<<endl;
        cout << "Dokument Faelschung: "<<endl;
        unsigned char hash[crypto_hash_sha512_BYTES];
        const size_t message_length2 = strlen(attack);
        cout <<attack<<endl;
        cout << "Message length: " << dec <<message_length2 << " characters" << endl;
        cout << "Hash length: " << (8 * sizeof hash)-508 << " bits" << endl;
        crypto_hash_sha512(hash, (const unsigned char*)attack, message_length2);

        cout << "Hash: " << hex;
    for(size_t k = 0; k < 2; k++)
        cout << setw(2) << setfill('0') <<(int)hash[k];
        cout << endl;
        libsodium_to_GMP(hash, hash_value2);
    //}
}


Dieser Post wurde am 15.06.2018 um 08:45 Uhr von Sandra39 editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
17.06.2018, 10:14 Uhr
f.-th.



GMP beim gezeigten Quelltext?

Ich weiß nicht in welchem Umfeld der Quelltext so geschrieben werden soll? Es gibt immer Gründe dafür. Z.B. der Lehrende akzeptiert kein C++11 oder jünger? Oder das ist kein reines C++, sondern irgend ein spezielles Umfeld das nur old-School-C++ kann? Oder ...

Zu einigen Punkten, auch schon bei etwas älterem C++ umsetzbar:
Muss der Q-text so lang sein und Redundanzen enthalten?
Die Dateiöffnungen sind in C++ aktuell meist kompakter.

Warum versuchst du die Dateien erst zu lesen, und anschließend prüfst du erst ob das überhaupt möglich ist?

strin.c_str() benötigt man heute, seitdem die Strings besser in C++ zu verarbeiten sind, äußerst selten. Compiler dann auf jüngeres C++ einstellen. Okay, hab noch mal etwas nachgesehen, deine Hash-Lib-Schnittstelle scheint etwas älteres C++ zu bevorzugen?


Überlisten des Hash:
Kann man bei deinem Markup im Datei-Kopf Änderungen vornehmen, die nicht sofort sichtbar sind?

Hash sind oft Prüfsummen, will mich da nicht so hinein lesen? Da die Summe bei dir um 1 höher ist musst du woanders, so das der Prüfalgorhythmus dies nicht erkennt, die Summe ...

Dieser Post wurde am 17.06.2018 um 10:26 Uhr von f.-th. editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
17.06.2018, 12:59 Uhr
f.-th.




Zitat von f.-th.:
...
strin.c_str() benötigt man heute, seitdem die Strings besser in C++ zu verarbeiten sind, äußerst selten. Compiler dann auf jüngeres C++ einstellen. Okay, hab noch mal etwas nachgesehen, deine Hash-Lib-Schnittstelle scheint etwas älteres C++ zu bevorzugen?
...




Die Hash-Lib-Schnittstelle ist schon älteren Ursprungs, vor der Jahrtausendwende, und muss im C-Stil mittels strin.c_str() aufgerufen werden. Das heisst aber nicht das der Quellcode der Lib nicht weiter gepflegt wird. Der Aufruf im C-Stil bietet die Möglichkeit die Hash-Lib aus allen Programmiersprachen, die C-Stil-Aufrufe für Schnittstellen verarbeiten können, zu nutzen.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
17.06.2018, 18:10 Uhr
Sandra39



Hallo,

danke für die Antwort. Ja das mit der Datei einlesen und dann der Abfrage hast du natürlich recht.
Wir haben die Bibliotheken von GMP und Libsodium benutzt, da die mpz_class eine wesentlich größere Zahl aufnehmen kann.
Unser Lehrender hat uns erklärt, dass diese Bibliotheken so auch in der Praxis verwendet werden. Die Änderungen sollen so sein, das sie für den Betrachter unsichtbar sind. Es handelt sich also um eine HTML-Datei:



C++:
<!DOCTYPE html>
<html>
      <head>
         <meta charset="UTF-8">
         <title>Signierter Vertrag</title>
      </head>
      <body>
           Ich, Alice, überweise Bob den Betrag von 100 Euro.
      </body>
</html>




Ich hab mir gedacht, dass man dann entweder Leerzeichen, Tabs und/oder HTML-Tags hinzufügt bzw. entfernt.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (WinAPI, Konsole) ]  


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: