Hilfe bei C++ "Verschlüsselungen"

Hallo zusammen!
Ich habe eine Frage und hoffe einer von euch kann sie mir beantworten. Vorerst einmal, bitte seht mir Fehler nach, ich lerne erst seit knapp einer Woche C++ ;)
Also, ich habe mir ein kleines "Verschlüsselungs Programm" zu Übungszwecken gebaut, welches normalen Text (also .txt und .bat [ja ich bin Windows User :| ] Dateien) verschlüsselt. Dazu lasse ich ein Passwort eingeben und den Asciicode von jedem Buchstaben dieses Passwortes ermitteln. Danach addiere ich zu jedem Buchstaben im Text der verschlüsselt werden soll, den Asciicode drauf. Also zum Beispiel:

erster Buchstabe in zu verschlüsselndem Text: A
Asciicode: 65

erstes Zeichen des Passwortes: 0
Asciicode des Zeichen im Passwort: 48

Ergebnis Ascii: 113
"A" wird umgewandelt zu: q

So ich hoffe die Erklärung war verständlich :)

Jetzt aber zu meiner eigentlichen Frage(endlich):
Lässt sich dieses Verfahren auf z.B. bei Bildern anwenden? Wenn man dessen Datei endung in txt umwandelt kann man ja auch Text sehen (halt nicht verständlich und nicht immer mir vertraute Zeichen).

Schonmal Danke für eure Mühe!
 

Bratkartoffel

gebratene Kartoffel
Premium-User
Hi,

ob Text oder Bild, das ist auf der Festplatte alles nur ein Strom aus Bits und Bytes. Von daher lässt sich deine Berechnung auch auf beliebigen Daten ausführen. Wichtig ist halt nur, dass du die Datei im Binärmodus öffnest (denke schon dass das bei C war) und Byte-für-Byte darüber iterierst.
Und denke bitte auch an die Fälle, wo ein Ergebnis > 255 (beim verschlüsseln) und < 0 (beim entschlüsseln) entstehen kann.

Erweiterungsvorschlag:
Ich würde dir für deinen Algorithmus anstatt der Addition / Subtraktion eher ein "exclusive or" empfehlen: https://en.wikipedia.org/wiki/Bitwise_operations_in_C#Bitwise_XOR_.5E
Somit hast du in beide Richtigungen (ver- und entschlüsseln) die gleiche Operation und musst dich nicht um Überläufe kümmern. :)

Noch einer:
Wenn du schon dabei bist, dann wirst du merken dass dein Passwort etwas unpraktisch für den Schlüssel ist. Was ist, wenn das Passwort nur 4 Zeichen lang ist und das Bild mehrere Tausend bytes hat? Einfach das Passwort nochmal von vorne durchlaufen? Das erzeugt dann (vorallem bei BMP Bildern sichtbar) schöne Muster. Hier wäre dann ein Key-Derivation-Algorithmus von Nutzen. Beispielsweise nach jeder "Runde" jeden Buchstaben des Passworts um eins erhöhen (aus "abc" wird dann "bcd").

Viel Spass weiterhin beim C(++) lernen :)

Grüsse,
BK
 
Hi Bratkartoffel,

erstmal Danke für die schnelle Antwort.
Ich habe bisher die Ascii Codes 34 bis 126 verwendet, da das die Zeichen waren, die ich benötigte. Ums "Überlaufen" habe ich mich schon gekümmert ;). Wie öffne ich die Datei denn im Binärformat, und muss meinen Quellcode umändern wenn ich von "normalen Buchstaben" aufs Binärformat umsteig? Oder reicht da ein cast hier und ein anderer da?

PS: Falls es was zur Sache tut (wie gesagt bin ich anfänger xD) ich benutze die <fstream> libary.

Edit: ach und bevor ichs vergesse, um die Sichertheit der Verschlüsselung gehts mir momentan noch nicht ;)

PPS: dein Link führt zu einer C# Seite wobei ich ja C++ benutze. Macht das einen großen Unterschied oder bleibt das Prinzip gleich? Wenn mir meine Verschlüsselung auch in anderen Dateien gelingt, schaue ich mir "deine Art" (vorgeschlagen) sehr gerne mal an.

LG
 

Bratkartoffel

gebratene Kartoffel
Premium-User
Also nochmal für die ganz Doofen,
ich öffne also die Datei (im Binärmodus?). Momentan verwende ich einfach den Command getline und addiere auf einen String jede line drauf.
Könntest du wenn du einen Moment Zeit und Lust hast mir ein kurzes Beispiel programm zeigen(braucht keinen Verschlüsselungs algorythmus vllt einfach jeden Buchstaben +1 mit dem Ascii Code). Nach dem ichs dann in einen String eingelesen habe mach ich einfach "(int)textInDerDatei[zähler variable meiner for schleife]+(zahl um dies erhöht wird)".

Gott habe ich das schlecht beschrieben aber besser bekomm ich grad nicht hin. Ich kann gerne auch mal die implementation meiner Funktionen posten ;)

PS: in deinem Link steht etwas von "fopen" allerdings benutze ich ja die fstream Bibliothek. Sollte ich umsteigen? (sind ja soweit ich weiß unterschiedliche Bibliotheken).
 
Hier schonmal die Implementation der VERschlüsselung:

C++:
Datei Datei::formatieren(Datei txt) {
 std::string form;
 int rot;
 int pwCounter=0;
 

 for (int i = 0; i < txt.text.length(); i++) {
  int ascii = txt.text[I];
  if (ascii == 94) {  //Zeilenumbruch nach Hut
   form += "\n";
  
  }else {

    pwCounter++;;
    if (pwCounter > passwort.length()) {
     pwCounter = 0;
     rot = (int)txt.passwort[pwCounter];
    }
    else {
     rot = (int)txt.passwort[pwCounter];
    }

    if (ascii >= 32 && (ascii + rot) <= 126) {
     form = form + (char)(ascii + rot);
    }
    else if ((ascii + rot) > 126) {
     ascii += rot;
     ascii -= 126;
     ascii += 32;
     form = form + (char)ascii;
    }//decryption

  }//zeilemubruch bei Hut

 }//for schleife
 txt.text = form;

 return txt;
}

Was genau müsste ich hieran ändern?

wunder dich nicht bei dem //zeilenumbruch nach Hut, war ein test xD[/I]
 
Zuletzt bearbeitet:

cwriter

Erfahrenes Mitglied
Wichtig ist halt nur, dass du die Datei im Binärmodus öffnest (denke schon dass das bei C war) und Byte-für-Byte darüber iterierst.
ich öffne also die Datei (im Binärmodus?)
Bei C gibt es tatsächlich einen Binär- und einen Textmodus: Wenn du im mode von fopen ein "b" mitgibst (z.B. in fopen(file, "rb") ), dann wird die Datei so gelesen, wie sie auf der Platte ist. Unter Windows ist das oft mit \r\n als Zeilenende (statt \n wie unter Linux; unter Mac ist \r das Zeilenende). Der "normale" Modus (kann auch mit 't' explizit verlangt werden) wandelt jeweils das \r\n in ein \n um. Das war's auch schon. Bei Bilddateien willst du das aber nicht, daher einfach ein mit "rb" öffnen (heutzutage kann man das eigentlich immer tun).

PS: in deinem Link steht etwas von "fopen" allerdings benutze ich ja die fstream Bibliothek. Sollte ich umsteigen? (sind ja soweit ich weiß unterschiedliche Bibliotheken).
Bei fstream (ifstream and ofstream) kannst du ein std::ios::binary als Parameter angeben:
C++:
std::ifstream file(filepath, std::ios::binary);

//...
file.getline();

Allerdings: Wenn es dir um pure Performance geht, wirst du nicht an std::ifstream::read() (oder fread(), was unter der Haube steckt) vorbeikommen. getline() ist vergleichsweise langsam, da ja das '\n' gesucht werden muss.

Gruss
cwriter
 
Hi cwriter,

Danke für die vielen Hinweise!

Habe ich dich richtig interpretiert, dass ich um Dateien aller möglichen Endungen gar nichts mehr ändern bräuchte? (Ausßer vllt Performance Technisch?)

LG
 

cwriter

Erfahrenes Mitglied
Habe ich dich richtig interpretiert, dass ich um Dateien aller möglichen Endungen gar nichts mehr ändern bräuchte? (Ausßer vllt Performance Technisch?)
Mit Binärem Lesen? Dateiendungen sind immer egal, Dateitypen nicht.
Da die wenigsten Dateien im ASCII-Bereich sind, funktioniert deine Overflow-Protection nicht mehr (korrekt): Bsp. bei 255.

Entsprechend würde ich auf XOR ausweichen, wie es BK schon empfohlen hat. Additionen gehen auch, aber dann würde ich den Anspruch, das Chiffrat auch in ASCII zu haben, fallen lassen.
Sonst müsstest du erst auf Base64 o.ä. ausweichen, was aber sehr ineffizient ist.

Gruss
cwriter
 
Mit Binärem Lesen? Dateiendungen sind immer egal, Dateitypen nicht.
Heisst also das wenn ich die Dateien im Binärformat öffne nicht auf den Datentyp (.exe .jpg .txt)achten muss? Dann aber noch eine frage: Ich öffne also mit fstream eine beliebige Datei im Binärformat und gebe ein Passwort ein und mache dann diese "logisches Oder" Methode. Wenn das falsch ist korrigiere mich bitte. Hast du gerade den Befehl im Kopf mit dem ich die Datei im Binärformat öffne? Und wie soll ich dann Byte für Byte aus lesen also was soll ich für "getline" verwenden?

LG