XOR ergibt 0, wie abschpeichern



  • Hallo, ich versuche zurzeit eine Verschlüsselung über eine Einfache XOR Verknüpfung mit einem Buchstaben aus dem Passwort und dem Klartext.

    Es funktioniert ja auch alles wunderbar, bis eben auf den einen Fall. Wenn Passwort Buchstabe und Klartext Buchstabe die gleichen sind, ergibt die XOR Verknüpfung zwangsweise 0 Byte.

    Und selbst die Char Variable in der ich das Ergebnis abspeichere, sagt mir im Debug, dass sie NICHTS enthält, an eine überführung an eine CString brauche ich da noch nicht daran zu denken.

    Beim wiederherstellen sieht man doch jetzt schon, dass es das Programm in die Irre führt, da ja dann ein Zeichen fehlt. Aus einem XOR verschlüsselten Text mit 10 Zeichen bleiben nach einem solchen Fall 9 verschlüsselte Zeichen zurück. Wenn man die Ordnung bei der Wiederherstellung (so wie es sich gehört) beim Passwort beibehält, dann funktioniert die Entschlüsselung bis zu dem Punkt wo der Fehler aufgetreten ist, der Rest ergibt den gleichen Datensalat wie immer, nur mit anderen Zeichen 🙂

    Gibt es vielleicht doch einen Weg das abzuspeichern, oder benutzt man hierfür irgendeinen Kniff à la

    if(cLinkedByte==0)
    {
    .
    //Tu Was
    .
    }
    


  • du musst die Daten einfach Binär speichern, dann hast du auch kein Problem mit der 0-Terminierung...

    btw. CString? std::string!



  • Ich progge Visual C++, dachte mir aber, dass es eher allgemein C++ ist, und nach den HowTo ("wo stelle ich eine Frage rein") habe ich mir gedacht es sei hier besser aufgehoben.

    Binär sagst du, klar, wenn 0 Byte rauskommt, dann speichert der mir natürlich 8 mal die binäre NULL.

    Welche Variable nehme ich aber dazu nu wieder her.



  • Benutzt Du C++ oder C IO?
    C++:

    ofstream file(...);
    char ch = ...;
    file.write(&ch, 1); // Schreibt ein char binaer nach file
    

    C:

    FILE *f = fopen(...);
    char ch = ...;
    fwrite(&ch, 1, 1, f); // Schreibt binaer..
    

    Ob nun in ch ein druckbares Asciizeichen drinsteht oder nicht, ist egal. Zum lesen einfach read oder fread benutzen.



  • Hi! Du hast anscheinend keine Ahnung was du tust!
    Mit binär Speichern ist einfach gemeint, dass du ein Char-Array mit den Bytes auffüllst. Dieses Array ist kein String, da du ihn nicht mit den Stringfunktionen bearbeiten kannst. Um das verschlüsselte wieder leserlich zu machen, musst du dem Programm merken lassen, wie lang das Array ist.
    Bspl:

    char text[] = "Hallo";
    int size = sizeof(text);
    
    /* Ausgabe text nach stdout */
    printf("%s\n", text);
    
    /* encoding */
    char* encodiert = new char[size];
    for(int i=0; i<size; ++i)
      encodiert[i] = text[i] ^ 'a';
    
    /* Ausgabe encodiert nach stdout */
    for(int i=0; i<size; ++i)
      putchar(encodiert[i]);
    
    /* decoding*/
    char* decodiert = new char[size];
    for(int i=0; i<size; ++i)
      decodiert[i] = encodiert[i] ^ 'a';
    decodiert[size-1] = 0; // nur zur Sicherheit. eigentlich ist text bereits null-terminiert und daher sollte decodiert durch die decodierung bereits null-terminiert sein. aber sicher bin ich mir da jetzt auch net.
    
    /*Ausgabe decodiert nach stdout */
    printf("%s\n", decodiert);
    


  • Danke, du hast es Erfasst. 😃 ICH HAB KEINE AHNUNG WAS ICH MACH (DENN: Sie wissen nicht was sie tun. 😉 ).

    Nö, nu mal im ernst, ich programmier furchtbar gern, es reicht nur selten die Zeit, um sich dauerhaft damit zu beschäftigen, bzw. komme ich dann hin und wieder an einen Punkt, an dem ich mit Google keine Antworten finde. Dann frage ich das Forum, und hier konnte mir bisher auch noch keiner so richtig helfen mit meinem Downloadstatus für ein FTP Programm. Bis auf den tollen Hinweis, die "Stückchenweise" über die WinAPI machen zu lassen, dafür habe ich sogar ein 10 Seiten Hanbuch da, hilft nur nix, dennmit der WinAPI bin ich selten bis garnicht beschäftigt, und somit kann ich da nicht beurteilen, was ich aus diesem Quelltext brauche, und was nicht.

    Aber jetzt echt mal fettes Merci an Euch, Ihr seid richtig Klasse. Muss ja schlimm sein immer wieder Fragen von Anfängern wie mir beantworten zu Müssen 😃 .


Anmelden zum Antworten