Hilfe bei C++ "Verschlüsselungen"

OK habe gerade nochmal ghenau gelesen und merke das ich im Post gerade totalen BLödsinn von mir gegeben habe. Da waren meine Finger wohl schneller als mein Kopf ;)
wie ich die Datei im Binärformat öffne hast du ja bereits geschrieben und getline KÖNNTE ich ja auch weiterhin benutzen ;) Kann ich denn auch weiterhin die ganzen Nullen und Einsen in einen String packen und danach einfach in die Datei reinpacken? Oder muss ich das irgendwie manuel machen?
 

cwriter

Erfahrenes Mitglied
Heisst also das wenn ich die Dateien im Binärformat öffne nicht auf den Datentyp (.exe .jpg .txt)achten muss?
Nicht vermischen: .exe ist eine Dateiendung. Du kannst auch "bild.jpg" in ein "bild.exe" umwandeln (Doppelklicken funktioniert nicht mehr, aber ein einfaches Rückbenennen ist möglich). Der Datentyp wird üblicherweise als MIME-Type angegeben, jpg ist z.B. "Image/JPEG".
Binäres Lesen ist aber immer gleich: Alle Dateien bestehen aus Bytes, die du lesen kannst.
diese "logisches Oder" Methode
Nein, logisches exklusives oder. Logisches oder ist: A oder B = A, B oder A und B.
Logisches exklusives Oder ist: A xor B = (A und nicht B) oder (B und nicht A).
In Logischer Schreibweise: A xor B = (A ∧ ¬B) ∨ (¬A ∧ B).
(∨ = OR, ∧ = AND, ¬ = NOT).
In C, bitwise operators:
Oder: |
Und: &
Not: ~
XOR: ^

logische Operatoren (für dich hier unnütz, aber zur Vollständigkeit):
Oder: ||
Und: &&
Not: !
XOR: != (Auf Bool-Ebene...)

Siehe dazu auch den Wikipediaartikel.
Hast du gerade den Befehl im Kopf mit dem ich die Datei im Binärformat öffne?
std::ifstream(file, std::ios::binary) schon vergessen?

wie ich die Datei im Binärformat öffne hast du ja bereits geschrieben und getline KÖNNTE ich ja auch weiterhin benutzen ;)
Könntest du, solltest du nicht. Getline liest bis zum ersten \n. Das geht gut bei Text, da man annimmt, dass es nicht allzu lange Zeilen gibt. Bei gewissen Binärdateien kommt das aber nie vor => du liest eine ganze Datei auf einmal.
Kann ich denn auch weiterhin die ganzen Nullen und Einsen in einen String packen und danach einfach in die Datei reinpacken?
Achtung: Du liest nicht Bits, du liest Bytes. (Eine Textdatei binär gelesen liest sich fast so wie eine Textdatei im Textmodus - nur die Zeilenenden unterscheiden sich).
Wenn du Bytes liest, liest du schlicht eine Zahlenfolge von einzelnen Zahlen in 0..255. Die Interpretation davon ist für Verschlüsselungen egal.

Gruss
cwriter
 
Zuletzt bearbeitet:
Ok erstmal danke :)
Werde heute Abend noch ein wenig mit meinem jetzigen Programm rumspielen und mich morgen mal mit dem Oben geschriebenen auseinander setzen.
Ich hoffe ich werde dich(oder jemand Anderen) erreichen wenn ich morgen mit irgendetwas nicht zurecht komme.

Eine Sache möchte ich allerdings heute noch erfragen:
Ich muss ja ein passwort eingeben damit ich dass logische exclusive Oder benutzen kann(brauche ja 2 zahlenfolgen aus 0 und 1). Das Passwort werde ich ja höchstwarscheinlich mit normalen Buchstaben schreiben, daraus geht ja vor dass ich das casten muss oder nicht? Also halt in Pseudo Code:

Passwort eingeben:
eingabe>>sicher123
passwort=(binary format)eingabe

Korrektur erwünscht ;)

LG und Gute Nacht
 
Zuletzt bearbeitet:

cwriter

Erfahrenes Mitglied
Eine Sache möchte ich allerdings heute noch erfragen:
Ich muss ja ein passwort eingeben damit ich dass logische exclusive Oder benutzen kann(brauche ja 2 zahlenfolgen aus 0 und 1). Das Passwort werde ich ja höchstwarscheinlich mit normalen Buchstaben schreiben, daraus geht ja vor dass ich das casten muss oder nicht?
Nein.
Sagen wir, du hast
C++:
char a ='a'; //a == 97 == 0b1100001
char b = 'b'; //b == 98 == 0b1100010

char c = a ^ b; //c == 3 == 0b11
Die "normalen" Buchstaben sind schon Zahlen und binär codiert, da kannst du nichts casten.

Gruss
cwriter
 
Zuletzt bearbeitet:
Wow das heißt ja das ich außer den Dateiaufruf im Binär Format, der Ersetzung von addition zu XOR, und getline nichts mehr ändern muss?

Habe ich das richtig verstanden?

Nochmal danke für deine Geduld mit einem Anfänger wie mir xD
 

cwriter

Erfahrenes Mitglied
:)
Habe ich das richtig verstanden?
Falls du die "Overflow-Korrektur" da mit einschliesst: Ja.

Verschlüsselung und Entschlüsselung mit XOR ist sehr einfach:

C++:
char c = 'X';
char pass = 'Y';
char encrypted = c ^ pass;
char decrypted = encrypted ^ pass;
Dass dann einfach für alle Bytes in der Datei wiederholen.

Allerdings zeigt das auch, wie schwach XOR ist: Die Sicherheit kommt einzig aus dem Schlüssel. Wird dieser wiederholt, sinkt die Sicherheit stark (siehe One Time Pad).

Und zur Geduld: Gehört doch dazu, gerngeschehen :)

Gruss
cwriter
 
Ich melde mich mal wieder xD

Also ich habe folgendes Problem mit dem Lesen der Datei.
Zum öffnen benutze ich:
C++:
quelle.open(datei.dateiPfad, std::ios::binary);
Zum lesen momentan:
C++:
while (!quelle.eof()) {
   datei.text+=quelle.get();
  }
Wenn ich das Programm allerdings ausführe öffnet sich die Datei "iosfwd", und folgende fehlerMeldung wird angezeigt:
"Ausnahmefehler bei 0x004AD6CC (ucrtbased.dll) in Verschl.exe: 0xC0000005: Zugriffsverletzung beim Lesen an Position 0x0000053D".

Ach ja, in der "iosfwd" wird in folgendem Block, folgende Line mit einem Roten X versehen:
C++:
static size_t __CLRCALL_OR_CDECL length(_In_z_ const _Elem * const _First) _NOEXCEPT // strengthened
  { // find length of null-terminated string
  return (_CSTD strlen(_First));//diese Line ist wohl der Fehler?
  }

Hat jemand einen Rat für mich? Bekomme das nicht raus :(

Edit: Ok das ist jetzt (für mich) ganz merkwürdig. Durch manuelles Debuggen habe ich rausgefunden, dass der Fehler in diesem Coeschnipsel liegt (hatte ihn eingebaut um zu überprüfen ob etwas eingelesen wurde):
C++:
std::cout << datei.binary << "\n\n";
 
Zuletzt bearbeitet:

cwriter

Erfahrenes Mitglied
Ok wo der Fehler liegt weiss ich ja jetzt ;) Ob die Datei existiert und geöffnet wurde überprüfe ich bereits also kann es das nicht sein...
Danke, die Blockoperatoren sehe ich mir mal an.
Noch eine Frage: Warum kein ".eof()"?