Ich hatte mal nichts zu tun also hab ich mir gedacht ich schreibe mal ein kleinen Beitrag über die Caesar Verschluesselung, mit c++ Source für die Ver- und Entschluesselung.
Ich weiÃ? es ist die einfachste Verschluesselung die es gibt aber ich denke fuer Leute die in die Kryptographie einsteigen wollen ist es ein interessantes Beispiel. Das ist wie das "Hello World" bei jeder Programmiersprache
ZitatAlles anzeigen
Was ist die Caesar Verschluesselung?
Die Caesar Verschluesselung ist eine Verschluesselungsmethode die Julius Caesar entwickelt hat. Wenn ich mich nicht taeusche war Julius Caesar der erste der seine Nachrichten verschluesselt gesendet hat.
Es ist die einfachste Methode die es gibt.
Wie funktioniert die Verschluesselung?
Als Caesar seine Nachrichten schrieb, hat das das Alphabet um eine bestimmte Anzahl an stellen verschoben.
Diese Zahl war der Schlüssel. Nun hat Caesar jeden Buchstaben des eigentlichen Wortes, durch den Buchstaben
ersetzt der eine bestimmte anzahl von Buchstaben weiter vorne im Alphabet war. Das ganze als Beispiel:
Die oberste Reihe ist das Alphabet in der normalen Form und darunter das verschobene, für das Beispiel verschieben wir es um 3 Stellen.
abcdefghijklmnopqrstuvwxyz
xyzabcdefghijklmnopqrstuvw
also hat er für jedes "a" ein "x" geschrieben und für "b" ein "y" usw.
Aus dem Wort "Hallo" wird dann "exiil".
Als er dann seine Nachricht dem Boten uebergab, sagte er ihm, dass er dem Empfaenger die Zahl 3 sagen soll, nichts weiter. Der Empfaenger muss natuerlich ueber die Verschluesselung bescheid wissen sonst kann er damit auch nichts anfangen. Da er nun die Nachricht hat und auch den Schluessel kann er das ganze jetzt wieder rueckgaengig machen indem er fuer jedes "x" ein "a" einsetzt und fuer jedes "y" ein "b", usw...
soviel zum Theoretischen Teil, nun kommen wir zum Code, ich werde als erstes den kompletten Code posten
und danach werde ich alles Erklaeren.
sieht doch gar nicht so schlimm aus
Wie ihr seht uebergebe ich der Funktion 2 Argumente, das eine ist ein Zeiger auf das Wort das ich verschluesseln moechte und das andere ist eine int Variable die den Schluessel darstellt.
danach deklariere ich eine Variable des Typs char, in der ich nachher den verschluesselten Buchstaben speicher. Jetzt kommt ein for-loop, der jeden einzelnen Buchstaben des Wortes ausliesst und verschluesselt.
Somit waeren wir hier angekommen:
als erstes wandele ich den Buchstaben an der Stelle "i" im Wort in den ASCII-Wert um:
danach addieren wir "dif" (den Schluessel) dazu:
das ganze wandeln wir wieder in ein "char" um und fügen den verschluesselten Buchstaben an der Stelle "i", dem zu verschluesselten Wortes, wieder zu.
Das Passiert mit allen Buchstaben in dem Wort, als aller letztes geben wir nur "true" zurück und das
wars auch schon.
Fuer die entschluesselung kommt der gleiche Algorithmus zur arbeit mit dem Unterschied, dass die Differenz
abgezogen wird und nicht dazu gezählt. Das würde dann so aussehen:
Schlusswort:
Ich hoffe ihr habt das ganze verstanden, wie schon gesagt das ist eine sehr schwache Verschluesselung, aber
es soll ja auch nur ein Historisches Beispiel sein, das ganze laesst sich jetzt noch ausbauen, das man
z.B. statt einer einzigen Zahl das ganze mit mehreren Schluesseln verschluesselt, aber das ist jetzt euch
ueberlassen.
greets
r1cky
Src (coded by xsheep):
- #include <iostream>
- #include <string>
- #include <fstream>
- using namespace std;
- int erkennen(string pfad){
- ifstream in;
- int out;
- int e_text;
- int temp=0;
- int zaehler=0;
- int e_deutsch=4;
- int text[26]={0};
- char zeichen;
- in.open(pfad.c_str(), ios_base::in);
- while(in.get(zeichen)){
- if(zeichen>96&&zeichen<123){
- text[zeichen-97]++;
- zaehler++;
- }else if(zeichen>64&&zeichen<91){
- text[zeichen-64]++;
- zaehler++;
- }
- }
- for(int i=0; i<=25; i++){if(temp<text[i])temp=text[i];e_text=i;}
- out=e_text>=e_deutsch?e_text-e_deutsch:26-(e_deutsch-e_text);
- in.close();
- return out;
- }
- int verschieben(char input, int inkey){return input>64&&input<91?(input+inkey>90?(input+inkey)-26:input+inkey):(input>96&&input<123?input+inkey>122?(input+inkey)-26:input+inkey:input);}
- int main(){
- ifstream dat_ein;
- ofstream dat_aus;
- string pfad;
- string crypt;
- string prefix;
- char key;
- char zeichen;
- char zeichen_crypt;
- int verschiebung=0;
- int modus=0;
- bool add=false;
- bool autom=false;
- cout << endl;
- cout << "--------------------------------" << endl;
- cout << "Ceasar-Verschl\x81 \bsselung by xsheep" << endl;
- cout << "--------------------------------" << endl;
- cout << "Wollen sie verschl\x81 \bsseln (1) oder entschl\x81 \bsseln (2) ? ";
- cin >> modus;
- prefix=modus==2?"ent":"ver";
- add=modus==2?true:false;
- cout << "Bitte geben sie den Pfad des zu " << prefix << "schl\x81 \bsselnden Files ein : ";
- cin >> pfad;
- if(add){
- cout << "Wollen sie den Schl\x81 \bssel manuell eingeben (1) " << endl << "oder wollen Sie den Schl\x81 \bssel automatisch bestimmen lassen (2) ?" << endl;
- cin >> modus;
- if(modus==2){
- verschiebung=erkennen(pfad.c_str());
- key=verschiebung+64;
- verschiebung=26-verschiebung;
- cout << "Ermittelter Schl\x81 \bssel : " << key << endl;
- autom=true;
- }else{autom=false;}
- if(!autom){
- cout << "Bitte geben sie den Schl\x81 \bssel ein (A-X) : ";
- cin >> key;
- }
- }else{
- cout << "Bitte geben sie den Schl\x81 \bssel ein (A-X) : ";
- cin >> key;
- }
- verschiebung=add&&!autom?(key>96&&key<123?26-(key-96):(key>64&&key<91?26-(key-64):1)):(!add?key>96&&key<123?key-96:(key>64&&key<91?key-64:1):verschiebung);
- dat_ein.open(pfad.c_str(), ios_base::in);
- dat_aus.open(pfad.c_str(), ios_base::in);
- if(!dat_ein||!dat_aus){
- cout << "File '" << pfad << "' konnte nicht ge\x94 \bffnet werden. Programm wird abgebrochen." << endl;
- return -1;
- }else{
- cout << "File wird gelesen und " << prefix << "schl\x81 \bsselt ..." << endl;
- while(dat_ein.get(zeichen)){
- zeichen_crypt=verschieben(zeichen,verschiebung);
- dat_aus << zeichen_crypt;
- }
- cout << "File erfolgreich " << prefix << "schl\x81 \bsselt. Programm wird beendet." << endl;
- cout << "--------------------------------";
- }
- dat_ein.close();
- dat_aus.close();
- return 0;
- }