C++ ver-/entschluesselung

hallo,
ich bin ein absoluter neuling im forum wie auch bei c++.
mein erstes programm war ein taschenrechner(simpel programmiert), der vor der benutzung den benutzernamen und das passende passwort abgefragt hat…
jetzt habe ich mich an etwas interessanteres gemacht: verschlüsselung
ich habe im netz schon mehr darüber gelesen, hab aber immer nur bahnhof verstanden, da mir die meisten befehle fremd waren.
jetzt bin ich bei einer simplen „zeichen-durch-zahlen-ersetzen-verschlüsselung“ angelangt, habe bei den feinheiten aber noch probleme:

wenn ich in meinem verschlüsselungsprogramm „ab“ eingebe, gibt er mir folgendes aus:
a(verschlüsselt)
b(verschlüsselt)
ich hätte gerne, dass er es in einer zeile ausgibt und am besten gleich in einer .txt-datei speichert.

gebe ich aber das oben gewünschte ergebnis in mein entschlüsselungsprogramm ein, so passiert NICHTS
weshalb? wie kann ich das problem beheben?

gebe ich das verschlüsselte in mehreren zeilen ein, gibt er mir das aus:
a(verschlüsselt)
a
b(verschlüsselt)
b
kann ich nicht zuerst a(verschlüsselt)b(verschlüsselt)eingeben und das ergebnis dann auch in einer zeile ausgegeben bekommen?

in ferner zukunft sollte die verschlüsselung noch mutieren, was jedoch mein LANGZEITZIEL ist und momentan nebensächlich

könnt ihr mir helfen? ich bin gerne bereit eure tipps auszuprobieren, soweit ich sie verstehe, wäre euch aber auch dankbar, wenn ihr mir auch code posten würdet.

das programm ist wirklich simpel, macht euch bitte nicht lustig darüber!


quellcode(verschlüsselung):

#include
#include
using namespace std;

int main()
{
string p;
cin >> p;//passworteingabe
if(p == „passwort“)//passwort
{

int counter = 0;
while (counter >= 0)
{
counter++;

char zeichen;

cin >>zeichen;// eingabe des zu verschlüsselnden textes

//1. zeichen=anfang: start (1)
//2. zeichen=beschreibung: grossbuchstabe, kleinbuchstabe, zeichen, zahl (33, 22, 32, 23)
//3.&4. zeichen=information: letter/ziffer (4, 5, 6, 7, 8, 9)
//5. zeichen=ende: schluss (0)

if (zeichen == ‚a‘){cout
#include
using namespace std;

int main()
{
int counter = 0;
while (counter >= 0)
{
string s1;
cin >> s1;//eingabe des zu entschlüsselnden textes

if (s1 == „122440“){cout

Hi Feuerklinge.
Wenn du bei deiner „Entschlüsselung“ alles hintereinander schreibst, wird alles bis die ganze Linie als ein String angesehen. Das Programm tut also genau das was du ihm sagst. Da der eingegebene String mit keinem vorgegebenen String übereinstimmt, tut es nichts. :wink:
Gibst die die „verschlüsselten“ Zeichen Zeilenweise ein, stimmt der eingegebene String mit einer der Vorgaben überein, und das Zeichen wird ausgegeben.
Als einfache Lösung könntest du den eingegebenen String auf Leerzeichen hin durchsuchen, und wenn eines gefunden wird, den String aufteilen.
Ich hoffe geholfen zu haben.
Gruß
re-G

danke re-g
da bin ich aber gestern auch noch selbst drauf gekommen.
außerdem hab ich die ganzen endl; weg genommen. jetzt wird alles in einer zeile ausgegeben.
momentan bin ich dabei zu versuchen, die ausgabe in eine datei zu speichern
ich hab ja aber hilfe:
a) internet
b) einen von 6 bundessiegern informatik 2008

ps hab die verschlüsselungszahlen verändert, damit keine regelmäßigkeit vorhanden ist.

Hallo,

ps hab die verschlüsselungszahlen verändert, damit keine
regelmäßigkeit vorhanden ist.

Es ist egal, womit Du substituierst, die Art der „Verschlüsselung“ bleibt gleich und damit äußerst schwach.

Eine gute Verschlüsselung ist alles andere als einfach. Daher nutzt man dafür auch am besten fertige Bibliotheken, die entprechend bewährte Algorithmen zuverlässig umsetzen.

Eine solche Bibliothek wäre z.B. die openSSL

http://www.openssl.org/

Versuche doch mal, mit Hilfe der fertigen Bibliotheken ein Programm zu schreiben, dass z.B. „blowfish“ anstelle Deines Selbstbaus nutzt. Dann lernst Du mindestens genauso viel und hast hinterher eine richtige Verschlüsselung.

Gruß

Fritze

ja, danke für den tipp.
ich denke für den autonormalverbraucher reicht meine jetztige verschlüsselung. ich will erst mein EIGENES projekt beenden, befor ich externe dateien miteinbeziehe…
soweit ist jetzt auch alles fertig…
nur noch ein problem:
ich kann dateien in mein programm einlesen, die werden dann aber nicht entschlüsselt…
und immer manuell einfügen ist eben nicht das ware…
weiß jemand rat?

Hallo,

ich denke für den autonormalverbraucher reicht meine jetztige
verschlüsselung.

Nein, sie reicht nicht. Wozu soll sowas denn gut sein?

ich will erst mein EIGENES projekt beenden,
befor ich externe dateien miteinbeziehe…

Ach. Aber „iostream“ und „string“ sind ebenfalls externe Bibliotheken. Woran machst Du denn fest, welche Du benutzten darfst und welche nicht, um ein Projekt ein „EIGENES“ nennen zu dürfen?

soweit ist jetzt auch alles fertig…
nur noch ein problem:
ich kann dateien in mein programm einlesen, die werden dann
aber nicht entschlüsselt…

Und das nennst Du „soweit alles fertig“? Dir wurde ja schon gesagt, woran das liegt. Du liest den gesamten verschlüsselten Text als einen einzigen String ein und vergleichst dann mit einem einzelnen Zeichen (dargestellt als sechsstellige Ziffernfolge). Dieser Vergleich scheitert, wenn der Text aus mehr als einem einzelnen Zeichen besteht. Dein Programm findet nichts zum entschlüsseln und beendet sich folgerichtig ohne weitere Ausgabe.

und immer manuell einfügen ist eben nicht das ware…
weiß jemand rat?

Du wirst wohl nicht umhin kommen, Deinen Text „Zeichen für Zeichen“ einzulesen und entsprechend zu vergleichen.

Gruß

Fritze

so, ich muss nicht jedes zeichen für zeichen einzeln eingeben!
mein verschlüsselungsprogramm speichert eine zahl, macht ein leerzeichen und speichert die nächste zahl. folglich wird jede zahl als separatrer string erkannt und ich muss nicht wie der infomeister behauptet jedes zeichen einzeln eingeben.
momantan bin ich dabei eine datei mit getline einzulesen und so zu entschlüsseln
mir ist klar, dass man mein passwort sehr leicht mit einem hexeditor wegen des vergleichs auslesen kann…
das programm ist aber nur dafür gedacht, um meine daten in der schule vor anderen schülern zu sichern
wie viele von denen wissen denn bitteschön, dass sie das einen hexeditor benutzen müssen?

neuer quelltext:

#include
#include
#include
using namespace std;

int main()
{
cout > p;//passworteingabe
if(p == „passwort“)//passwort
{
int counter = 0;
ofstream schreiben(„Protokoll.txt“);//datei, in die verschlüsselt wird
while (counter >= 0)
{

counter++;

char zeichen;

cin >> zeichen;// eingabe des zu verschlüsselnden textes

//verschluesselung:
//1. zeichen=anfang: start (1)
//2. zeichen=beschreibung: kleinbuchstabe, grossbuchstabe, zahl, sonderzeichen (2, 3, 4, 5)
//3.&4. zeichen=information: kodiertes zeichen (zufaellig!) (2, 3, 4, 5, 6, 7, 8, 9)
//5. zeichen=ende: schluss (0)

if (zeichen == ‚a‘){cout

ich denke für den autonormalverbraucher reicht meine jetztige
verschlüsselung.

Dein Verschlüsselungs-Programm ist sicherlich ein schönes Projekt um programmieren zu üben. Aber um damit Daten zu schützen die auch nur im entferntesten sensitiv sind, taugt sie aber nicht. Sowas lässt sich ohne irgendwelche Probleme knacken.

ich will erst mein EIGENES projekt beenden,
befor ich externe dateien miteinbeziehe…

Du könntest aber - wenn du was eigenes machen willst - dich ja an der Implementierung einer bekannten einfachen Verschlüsselungs-Technik versuchen.
Z.B. könntest du damit anfangen, dass du die Caesar-Verschlüsselung implementierst. Dort wird einfach das Eingabealphabet rotiert. Wie weit rotiert wird, ist dabei das „Passwort“.
Damit kannst du zumindest schon mal mit nicht fest vorgegebenen Passwörtern verschlüsseln, und müsstest das Passwort nicht in deinem Programm abspeichern.
http://de.wikipedia.org/wiki/Verschiebechiffre

Beim Cäsar’s Chiffre ergibt aber nach wie vor ein gleiches Wort im Eingabetext immer denselben Geheimtext, was nicht gut ist. Wenn du die Cäsar-Verschlüsselung geschafft hast, könntest du deshalb z.B. als nächstes die Vignere-Verschlüsselung probieren. Dort wird der Eingabetext mit einer Aneinanderreihung des Passwortes verknüpft. Damit ergeben gleiche Wörter im Eingabetext in der Regel nicht mehr denselben Geheimtext. Das ist schon etwas besser.
http://de.wikipedia.org/wiki/Vigen%C3%A8re-Verschl%C…

Wenn du auch das geschafft hast, könntest du versuchen, eine Enigma zu implementieren. Das ist schon deutlich komplexer und lässt sich schon wesentlich schwerer knacken. Hier würde ich auch zum ersten Mal überhaupt von einer halbwegs brauchbaren Verschlüsselung sprechen (natürlich ist auch das nicht für sensitive Inhalte geeignet). Allerdings ist die Implementierung einer Enigma auch schon viel schwieriger.
http://de.wikipedia.org/wiki/Enigma

Und: Ich würde die zu verschlüsselnde Datei Byte-weise einlesen und verschlüsseln. Dann kannst du damit auch Binär-Dateien wie z.B. Word-Dokumente oder ähnliches verschlüsseln. Bei allen oben genannten Chiffren ist dies ohne Probleme möglich.

Liebwerte Feuerklinge,

Ahhh!
Danke für die netten Gegenfragen!!!

1
ifstream Quelldatei;
Quelldatei.open(„a.txt“, ios_base::in);
ofstream Zieldatei(„b.txt“);
char c;
while (Quelldatei.get©)
{
if(c == ‚buchstabe‘){Zieldatei.put(‚verschlüsselter buchstabe‘);}
}

Aber ‚verschlüsselter buchstabe‘ darf nicht mehr als ein Buchstabe sein, auch wenn ich „“ verwende.

2
Wie man erkennt, ob eine Datei zuende ist:frowning:mein Vorschlag)
beim Kodieren ein Endzeichen anfügen, dass beim Dekodieren den Schleifanabbruch zur Folge hat.

3
Kein Plan!

4
Weil ich kein char, sondern ein string (mehrere Zeichen) einlese.

5
Ich muss mein Entschlüsselungsprogramm so schreiben, dass es strings einliest. Daran bin ich jedoch schon verzweifelt!

6
Ich wollte das Ende eines Strings durch die „0“ erkannbar machen. Ich weiß aber nicht mit welchen Befehlen ich das mache. Ich habe schon gesucht und eine Art „finde&ersetze“ versucht zusammenzubauen, was jedoch nicht funktioniert hat.

Kannst du mir dabei noch weiterhelfen? Tut mir leid, wenn ich mich ein wenig dumm anstelle! Vielen Dank für deine bisherige Hilfe!

@deconstruct: Vielen Dank für die Hinweise (Links)
Die werden mir gewiss noch weiterhelfen, doch wollte ich erst einmal meine eigene Idee vom Verschlüsseln verwiklichen, auch wenn das vielen dumm vorkommt. Das hat mit meiner Philosophie zu tun…

Ich habe gelesen, dass man einen String mit „\0“ beenden kann.
Wenn ich das mache tut sich jedoch nichts!
Kann mir bitte jemand sagen, wie ich einen String schließen kann?

Hallo,

ifstream Quelldatei;
Quelldatei.open(„a.txt“, ios_base::in);

Du solltest grundsätzlich auf Fehler prüfen, wenn Du eine Datei öffnest. Was passiert, wenn es die Datei nicht gibt? Dein Programm sollte dann eine sinnvolle Fehlermeldung liefern und sich geordnet beenden. Da Du die Quelldatei als eingehenden Stream (ifstream) deklariert hast, kannst Du Dir das „ios_base::in“ sparen.

ofstream Zieldatei(„b.txt“);

Genauso hier. Was ist, wenn die Datei nicht erzeugt werden kann? Oder wenn es sie schon gibt? Soll sie überschrieben werden oder doch lieber ergänzt?

char c;

Zeichen sollte man als „int“ nicht als „char“ definieren. Dann hat man weniger Probleme mit Sonderzeichen wie „EOF“ (End-Of-File) oder „NUL“ (das \0 Ding, was C-Strings terminiert). Auch multibyte Character, die immer beliebter werden, um Sonderzeichen über 8 Bit hinaus darstellen zu können (Unicode) sind dann leichter zu handhaben.

while (Quelldatei.get©)

A propos „EOF“. Hast Du mal geschaut, wie man das Dateiende erkennen kann? Du solltest also Deine „while“ Schleife auf „EOF“ prüfen lassen.

{
if(c == ‚buchstabe‘){Zieldatei.put(‚verschlüsselter
buchstabe‘);}
}

Aber ‚verschlüsselter buchstabe‘ darf nicht mehr als ein
Buchstabe sein, auch wenn ich „“ verwende.

Warum? Es zwingt Dich niemand, nur einen Buchstaben für jeden eingelesenen Buchstaben auszugeben. Du darfst „put“ durchaus mehrfach anwenden.

2
Wie man erkennt, ob eine Datei zuende ist:frowning:mein Vorschlag)
beim Kodieren ein Endzeichen anfügen, dass beim Dekodieren den
Schleifanabbruch zur Folge hat.

Pfiffigerweise wird ein Endzeichen automatisch verwendet. Das EOF (End Of File).

3
Kein Plan!

Zeichen für Zeichen so lange einlesen, solange kein EOF kommt.

4
Weil ich kein char, sondern ein string (mehrere Zeichen)
einlese.

Du kannst noch immer Zeichen für Zeichen in einen String einlesen und diesen bei Erkennen eines Leerzeichens entsprechend mit Deiner Tabelle vergleichen.

5
Ich muss mein Entschlüsselungsprogramm so schreiben, dass es
strings einliest. Daran bin ich jedoch schon verzweifelt!

Warum? Datei öffnen und nach wie vor einzelne Zeichen einlesen, solange kein EOF kommt.

Die eingelesenen Zeichen in einem String speichern, bis ein Leerzeichen eingelesen wird. Den String dann mit der Tabelle vergleichen und Klartext-Buchstaben in Ausgabedatei schreiben.

6
Ich wollte das Ende eines Strings durch die „0“ erkannbar
machen. Ich weiß aber nicht mit welchen Befehlen ich das
mache. Ich habe schon gesucht und eine Art „finde&ersetze“
versucht zusammenzubauen, was jedoch nicht funktioniert hat.

Das NUL Zeichen (nicht mit dem NULL Pointer verwechseln) ist ein Sonderzeichen. Du kannst es mit \0 ausgeben. Wenn Du die string-Methoden von C++ nutzt, musst Du Dir darüber aber normalerweise wenig den Kopf zerbrechen. Es ging bei meiner Frage darum, dass Dein Programm natürlich kein Stringende erkennt, nur weil ein Leerzeichen in der Datei steht. Das musst Du selbst übernehmen (siehe oben).

Gruß

Fritze

Soweit, so gut. aber damit kann ich praktisch nicht viel anfangen:

"Warum? Datei öffnen und nach wie vor einzelne Zeichen einlesen, solange kein EOF kommt.

Die eingelesenen Zeichen in einem String speichern, bis ein Leerzeichen eingelesen wird. Den String dann mit der Tabelle vergleichen und Klartext-Buchstaben in Ausgabedatei schreiben."

Ich habe keine Ahnung, wie ich die eingelesenen Daten als String speichere. Wenn ich dann ein Leerzeichen habe, muss ich dann etwas in der art machen(?):

ifstream lesen;
lesen.open(„datei.txt“);
ofstream schreiben(„datei2.txt“);
string zeichen;
while ( getline ( lesen, zeichen ) )
{

/*irgendwie als string speichern*/

if ( gespeicherterstring == " " )
{
if ( zeichen == 123456 )
{
schreiben

Ich habe jetzt einen neuen Lösungsansatz für mein Problem:
Ich lese die verschlüsselte Datei in mein Programm ein, und suche nach beispielsweise 123456 und ersetze dies durch a

int counter = 1;
while(counter = 1)
{
if(stringObject1.find(„123456“))
{
pos = stringObject1.find(„123456“);
if( pos != string::npos )
stringObject1.replace(pos, 7, „a“);
}
}

Mir fehlt aber noch eine Abbruchbedingung!
Die Schleife soll abgebrochen werden, wenn er kein 12345 mehr im String findet.

Ich habe das so versucht:

if(!stringObject1.find(„123456“)){break;}

Das funktioniert aber definitiv nicht!

Wie muss ich das denn richtig machen?

Hallo,

Das mit dem get und put ist mir deutlich zu umständlich, da
ich dann meine mehreren hundert Zahlen alle auseinandernehmen
müsste.

Hä? Nicht Du sollst hunderte Zahlen auseinandernehmen, sondern der Computer soll das machen. Dafür hast Du ihn doch, oder? Und natürlich ist Deine pseudo-Verschlüsselung umständlich mit den vielen "if dann ist es " Krempel. Du weigerst Dich ja, fertige Bibliotheken anzuwenden.

In Pseudocode lautet die Entschlüsselung:

String initialisieren
CodeDatei zum lesen öffnen
KlarDatei zum schreiben öffnen

Zeichen aus CodeDatei Einlesen, solange das Zeichen nicht "EOF" ist
 Ist Das Zeichen ein Leerzeichen?
 Wenn Nein:
 Zeichen zum String hinzufügen
 Wenn Ja:
 String mit komischen Werten vergleichen
 Zeichen in KlarDatei schreiben
 String zurücksetzen
Nächstes Zeichen einlesen.

CodeDatei schließen
KlarDatei schließen

Wie Du das in eine Programmiersprache Deiner Wahl umsetzt, ist Dir überlassen.

Gruß

Fritze

ich hab es jetzt hinbekommen mein problem war, dass mir die verschlüsselungsowas ausgegeben hat:
123456 123457 123458

ich habe aber getline zum einlesen in einen string verwendet
nun funktioniert alles, da die verschlüsselung folgendes ausgibt:
123456
123457
123458

danke für die hilfe