Ein bisschen Theorie dazu:
Also es soll dem Programm klar gemacht werden das 1 zb H ist und es soll aus der Datei jedes H mit einer 1 ersetzen.
Ok. Wenn wir mal extended ASCII (256 Zeichen) nehmen, hat dein "dem Programm Klarmachen" eine Schlüsselkomplexität von O(256), abzüglich der Nicht-druckbaren oder nicht verwendeten Zeichen wohl noch etwa O(150), d.h. dein Schlüssel wäre bei mittellangen Nachrichten mit zufälliger Verteilung etwa 150 Zeichen lang.
Ich weiß das es keine Sichere verschlüsselung wäre aber ich mache das eben als Hobby mit dem Programmieren und ich stell mir gerne immer mal solche Aufgaben, und es wäre sicher auch mal ein kleines, vielleicht nützliches Tool mal gewisse Dinge evt mal leicht zu sichern
Gegen Teil 1 lässt sich nichts sagen. Teil 2: Nein, sicher nicht. Du sicherst damit gar nichts. Du hast nichts anderes als eine Substitution Cipher im Kopf. Selbst wenn du den Schlüssel nicht speicherst (was du ja wahrscheinlich tun wirst, weil wie schon angemerkt dein Schlüssel oft 150 Zeichen lang sein wird), lässt dies eine Häufigkeitsanalyse zu, und zusammen mit einigen Wörterbuchabgleichen bist du sehr schnell im Territorium von fast konstantem Entschlüsselungsaufwand. (Die "starke" Schlüssellänge von 150 Bytes verhindert immerhin Brute-Force von O(150!)).
Eine gute Übung wäre auch ein Programm, das solche Verschlüsselungen knackt.
Also, dann gibt es im Programm ein Array mit 256 Elementen (für jedes Byte einen), welche Bytenummer in welche Zahlenfolge übersetzt wird
Aus diesem Grund wird in der Praxis ein Pseudo Random Number Generator mit einem gesalzenem und gehashtem Passwort als Seed benutzt (Siehe IV, Initialization Vector). Dadurch kann die Schlüssellänge stark gekürzt werden, ohne nennenswert an Sicherheit einzubüssen.
Allerdings,
@sheel: Wenn du ohnehin einzelne Bytes ersetzt, warum dann ins Dezimalsystem übersetzen? Da ohnehin keine Doppelbelegung möglich sein kann, wäre ja ein einfaches shuffelling genug:
C++:
char table[256];
char key[256]; //Vorher gesetzt
for(size_t i = 0; i < 256; ++i)
table[i] = key[i];
(Ich sehe schon die Motivation hinter der Lesbarkeit, aber wenn du ohnehin alle Bytewerte ersetzen willst, war der Ausgangswert ja auch nicht lesbar. Und zu Übungszwecken sind einzelne Bytes wohl einfacher. Und ich sehe schon
Da es ja viele Buchstaben und Zeichen gibt, habe ich mir das auch so vorgestellt zwei bis dreifache ziffern zu nehmen. zb m=132, p=834, ....
aber ich sehe mit diesem Verfahren nur Nachteile.
)
hm den oberen Teil mit dem arrays zum regestrieren versteh ich, aber das mit der Übersetzungsfunktion hängt grad ein wenig :/
encrypt ist eine Funktion von char => std::string, wobei jedes Byte zu einem vordefinierten String übersetzt wird (ein Mapping).
Du musst nur jedes einzelne Byte der Eingabedatei in die Funktion füttern und die Ausgabe in eine andere Datei schreiben.
Gruss
cwriter