PHP Forum - Coding Board
Juni 19, 2018, 08:46:05 *
Willkommen Gast. Bitte einloggen oder registrieren.

Einloggen mit Benutzername, Passwort und Sitzungslänge
News:
 
   Übersicht   Hilfe Suche Einloggen Registrieren  
Seiten: [1]
  Drucken  
Autor Thema: [C++] Caesar Verschluesselung Historisches Beispiel  (Gelesen 259 mal)
0 Mitglieder und 1 Gast betrachten dieses Thema.
r1cky
Newbie
*
Beiträge: 16


Profil anzeigen E-Mail
« am: März 04, 2009, 07:08:51 »

quote]
[B]Was ist die Caesar Verschluesselung?[/B]

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.

Code:
bool encrypt(char *toEncrypt, int dif )
{
     char temp;
         
     for( int i=0; i<strlen(toEncrypt); i++ )
     {
          temp = (char)((int)(toEncrypt[i]) + dif);
          toEncrypt[i] = temp;
     }
     
     return true;    
}
sieht doch gar nicht so schlimm aus L&#228;chelnd

Code:
char *toEncrypt, int dif
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.

Code:
char temp;
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:

Code:
temp = (char)((int)(toEncrypt[i]) + dif);
als erstes wandele ich den Buchstaben an der Stelle "i" im Wort in den ASCII-Wert um:

Code:
(int)(toEncrypt[i])
danach addieren wir "dif" (den Schluessel) dazu:

Code:
(int)(toEncrypt[i])+ dif
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:

Code:
bool eecrypt(char *toDecrypt, int dif )
{
     char temp;
         
     for( int i=0; i     {
          temp = (char)((int)(toDecrypt[i]) [COLOR=Red]-[/COLOR] [COLOR=Red]dif[/COLOR]);
          toDecrypt[i] = temp;
     }
     
     return true;    
}
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. L&#228;chelnd

greets
r1cky



Src (coded by xsheep):

Code:

#include
#include
#include

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    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;

}
[/code
Zitat

[B]Was ist die Caesar Verschluesselung?[/B]

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.

[B]Wie funktioniert die Verschluesselung?[/B]

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.

[code]bool encrypt(char *toEncrypt, int dif )
{
     char temp;
         
     for( int i=0; i<strlen(toEncrypt); i++ )
     {
          temp = (char)((int)(toEncrypt[i]) + dif);
          toEncrypt[i] = temp;
     }
     
     return true;    
}
sieht doch gar nicht so schlimm aus L&#228;chelnd

Code:
char *toEncrypt, int dif
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.

Code:
char temp;
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:

Code:
temp = (char)((int)(toEncrypt[i]) + dif);
als erstes wandele ich den Buchstaben an der Stelle "i" im Wort in den ASCII-Wert um:

Code:
(int)(toEncrypt[i])
danach addieren wir "dif" (den Schluessel) dazu:

Code:
(int)(toEncrypt[i])+ dif
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:

Code:
bool eecrypt(char *toDecrypt, int dif )
{
     char temp;
         
     for( int i=0; i     {
          temp = (char)((int)(toDecrypt[i]) [COLOR=Red]-[/COLOR] [COLOR=Red]dif[/COLOR]);
          toDecrypt[i] = temp;
     }
     
     return true;    
}
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. L&#228;chelnd

greets
r1cky[/quote]


Src (coded by xsheep):

Code:

#include
#include
#include

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    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;

}
« Letzte Änderung: März 10, 2009, 10:58:44 von Klaatu » Gespeichert
Klaatu
Ex-Teammember
Full Member
***
Beiträge: 104



Profil anzeigen E-Mail
« Antworten #1 am: März 10, 2009, 11:00:13 »

Hab mal eine Source hinzugefügt, hoffe du bist damit einverstanden Zwinkernd Der Code stammt von xsheep, aber leider kann ich mich nicht erinnern von woher ich den Code habe L&#228;chelnd
Hab den Code mal hier und da einbisschen verändert Smiley
Gespeichert

r1cky
Newbie
*
Beiträge: 16


Profil anzeigen E-Mail
« Antworten #2 am: März 11, 2009, 03:24:59 »

vielen dank für die Source ^^
ich hab mir schon überlegt ob ich nicht noch eine Source für ein komplettes Programm dazu machen soll oder nicht...

und natürlich habe ich nix dagegen
greets
r1cky
Gespeichert
Seiten: [1]
  Drucken  
 
Gehe zu:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.21 | SMF © 2006-2009, Simple Machines | New Look by Nolt Prüfe XHTML 1.0 Prüfe CSS