ganz kleine kryptographie...



  • k, hab das jetzt einiger maßen hinbekommen, weiß aber jmd wie ich das ganze wieder umwandeln kann? also aus z.b. WP[[^ wieder ein hallo machen kann?
    //edit:
    hier mein algo:

    while(*plain)
      *ciph++=(25/4*0.45*-3/0.5)+(*plain++);
    


  • wenn du was einfaches haben willst machs doch per symmetrischen
    verfahren.
    zum ver- und entschluesseln veroderst du jedes byte der nachhrich.

    //pseudocode
    char* nachricht="Hallo Welt";
    char* schluessel="TheKey";
    
    // zum ver- und entschluesseln gleich
    // hier nochmal was zum iterieren ueber den schluessel
    for(i=0; i<nachricht-ende;++i)
      verschluesselt[i] = schluessel[x] ^ nachricht[i];
    


  • hi
    danke, das symmetrischen verfahren scheint genau das zu sein was ichs uche, könntest du es ein bischen erklären bzw erläutern ?



  • Hallo,

    entelechie wendet zum Verschlüsseln den XOR operator von c++ an. Er erhält den chiffrierten Text in dem er auf jedes Zeichen des plaintexts XOR mit dem entsprechenden zeichen des Schlüssels anwendet. Diese Operation ist reversible.

    XOR liefert 1 wenn die Verknüpften bits unterschiedlich waren.

    für

    plain key
    0000 0001 ^ 1000 0000 ergibt sich dann die chiffre 1000 0001

    wendet man nun den Schlüssel wieder auf die chiffre an:

    1000 0001 ^ 1000 0000 erhält man 0000 0001 was dem plaintext entspricht.

    So macht er es mit jedem Zeichen. Die schlüssellänge muss >= plaintextlänge sein. Um das zu erreichen kann man den schlüssel aneinanderhängen und einen bitstrom erzuegen.



  • plaintexts XOR mit dem entsprechenden zeichen des Schlüssels anwendet. Diese Operation ist reversible.

    da versteh ich nur bahnhof, hätte evtl jmd ein ganz einfaches beispiel wie ich
    z.b. den inhalt einer edit box verschlüsseln kann mir der genannten xor methode?
    vielleicht versteh ich das dann auch mal ^^



  • es ist im prinzip ganz einfach.
    symmetrisches verschluesselungsverfahren bedeutet,
    dass du zum ver- und entschluesseln den selben schluessel
    verwendest.

    void verschluessele( char* ausgabe, char* key, char* nachricht );
    
    char* nachricht = "hallo welt";
    char* key = "test";
    char ver[100];
    
    // verschluesselt nachricht und speichert das ergebnis in ver
    verschluessele( ver, key, nachricht );
    
    // ver enthaelt die verschluesselte nachricht
    cout << ver << endl; // gibt irgendeinen zeichensalat aus
    
    char ent[100];
    // wendet die selbe verschluesselungsroutine
    // auf ver an (ver ist die verschluesselte nachricht)
    // wodurch die nachricht entschluesselt wird
    verschluessele( ent, key, ver );
    
    // gibt "Hallo Welt" aus
    cout << ent << endl; // gibt irgendeinen zeichensalat aus
    

    das ver- bzw entschluesseln ist ganz simpel:
    (so koennte es ungefaehr aussehen)

    // eine art ringbuffer;
    // liefert bei jedem aufruf den naechsten index fur das
    // feld mit dem schluessel (key)
    // ist der index groesser als die anzahl der zeichen in key
    // wird wieder bei 0 begnnen.
    int nextKeyIndex()
    {
      static int i = 0;
      if ( i >= keyLaenge ) // keyLaenge ist die anzahl der zeichen in key
        i = 0;
      else
        ++i;
      return i;
    }
    
    verschluessele( char* ver, char* key, char* nachricht )
    {
       for ( int i = 0; i < nachrichtenLaenge; ++i )
         ver[i] = nachricht[i] ^ key[nextKeyIndex()];
    }
    

    vielleicht hilft dir auch das:
    http://www.code4gold.net/tut/Kryptographie.pdf



  • Also ganz großes dankeschön 🙂
    aber hab noch paar fragen zum code ^^

    void verschluessele( char* ausgabe, char* key, char* nachricht );
    

    das leitet ha due funktion verschluessele ein, müsste das nicht eigentlich
    void balbal(balbal){
    ...
    }
    heißen?
    ________

    char* nachricht = "hallo welt";
    char* key = "test";
    char ver[100];
    

    da wird ja nicht wirklich ne funktion erstellt, vielmehr werden variablen wertw zugewiesen.
    und wo ist der unterschies zwichen char* und char ?
    Was bedeutet das [100] hinter ver?
    ________

    verschluessele( ver, key, nachricht );
    

    hier wird ja schon die ausgabe mitgeliefiert, aber das ist doch unlogisch, weil die ausgabe wird ja erst noch berechnet, also der verschlüsselte
    ________

    // gibt "Hallo Welt" aus
    cout << ent << endl; // gibt irgendeinen zeichensalat aus
    

    was wird da jetzt ausgegeben?
    eingentlich sollte ( weil es ja entverschlüsselt wird ) hallo welt ausgegeben werden.
    _______
    Was soll jetztd er zweite code zeigen den du mir geschickt hast?



  • statt

    // gibt "Hallo Welt" aus
    cout << ent << endl; // gibt irgendeinen zeichensalat aus
    

    soll es nur

    // gibt "Hallo Welt" aus
    cout << ent << endl;
    

    heissen. sorry das hab ich nur schnell rueberkopiert.
    das

    void verschluessele( char* ausgabe, char* key, char* nachricht );
    

    ist quatsch.

    das ganze sollte auch kein kompilierbarer code werden
    sondern nur ein beispiel wie du es machen kannst.

    char ver[100]; // feld mit 100 chars
    char* key; // zeiger auf ein char; kann auch der beginn eines felds sein
    

    is nich boes gemeint,aber schau dir nochmal pointer und arrays in
    einem c/c++ buch an.

    und nicht von den code schnipseln verwirren lassen. die
    sind meist nur c-aehnlicher pseudocode und keineswegs
    compilierbar.



  • is nich boes gemeint,aber schau dir nochmal pointer und arrays in
    einem c/c++ buch an.

    wür dich nicht so aufschnappen, weil ich bin für solche tipps eingentlich immer dankbar *schnellnachschlag*
    ______

    Code:
    void verschluessele( char* ausgabe, char* key, char* nachricht );

    ist quatsch.

    wie sollte das denn sein?



  • Wini schrieb:

    Code:
    void verschluessele( char* ausgabe, char* key, char* nachricht );

    ist quatsch.

    wie sollte das denn sein?

    Er sagte bereits, dass es sich nur um pseudocode handelt. Obwohls ne Funktionsdeklarations sein könnte.

    Darum brauchst dir keinen Kopf machen. Er hat dort nicht angefangen ne Funktion zu schreiben sondern lediglich sagen wollen, dass DU dann da die eigentlich Funktion einfügen sollst. Fertig implementiert mein ich.



  • verstehe verstehe, also da soll ich dann meine eigene funktion definieren?!
    allerdings hab ich vorher noch paar fragen ( wie schon die ganze zeit^^)
    Also fangen wir/ich mal an:
    Laut dem link den mir entelechie gegeben hat über kryptographie,
    scheint es als müsste man die Buchstaben in boolschewerte zerlegen,
    allerdings wie geht das ?
    und wie komme ich von boolschen werten wieder zu normalbuschtaben bzw orginal text?
    oder geht das auch anders, also ohne boolsche werte? wenn ja wie?
    und wie mache ich es, dass der Schlüssel genausolang ist wie der text bzw die zahlen,
    weil sonst würde die verschlüsselung nicht wirklich klappen, oder? 😕 🙄



  • Hallo,
    um die Binärdarstellung brauchst du dir keine sorgen machen.
    Ein char hat nicht nur einen "Zeichenwert" sondern auch einen Zahlenwert.

    char a,b,c;
    
    a='a';
    b='b';
    c='c'
    
    cout<<a<<b<<c<<endl;
    //wird abc ausgeben
    
    cout<<a+b+c<<endl;
    //wird 294 ausgeben
    

    Warum ? Weil a nicht nur der Buchstabe a ist, sondern auch den Zahlenwert 97 repräsentiert. Schau dir mal eine Asciitabelle an, dann weisst du was ich meine. Ob nun ein a oder 97 ausgegeben wird hängt vom Typ der Variablen ab. Das selbe Bitmuster wird vom cout-Object beim Typ char als a und z.B. beim Typ short als 97 ausgegeben. So 97 wiederrum sieht in der Binärdarstellung so aus 1100001. Du brauchst dich aber nicht um diese Umwandlung zu kümmern, weil C und C++ Operatoren bereitstellt die auf Bitebene arbeiten: Diese sind |,&,^,<<,>> und ~.
    Um also die XOR-Operation auf einen char anzuwenden brauchst du nur den ^ -Operator benutzen.

    char text[]="abc";
    char schluessel[]="def";
    char verschluesselt[4];
    
    //ich machs jetzt mal ohne schleife
    verschluesselt[0]=text[0]^schluessel[0];
    //geichbedeutend mit:
    //x=97 ^ 100 wobei sich dann für x 5 ergibt; vgl. bitmuster nach der
    //Operation wandel es in Zahl um und guck in der Asciitabelle welchem Zeichen
    //das entspricht.  
    verschluesselt[1]=text[1]^schluessel[1];
    verschluesselt[2]=text[2]^schluessel[2];
    

    Das wars schon. Keine Umwandlung in Binärformat und nix. In deinem Program würdest du das in einer Schleife machen.

    Der Schlüssel muss nicht unbedingt genauso lang sein. Wie gesagt kannst du einen Kürzeren schlüssel einfach immer aneinander hängen und Verschlüssel.

    int i,j;
    for(i=0,j=0;i<textlaenge;i++,j++){
        if(j==schluessellaenge) j=0;
        verschluesselt=text[i]^schluessel[j]; //edit: das muss natürlich text und nicht texlaenge heissen
    }
    

    Dadurch das j immer wieder auf 0 gesetzt wird wenn die Länge des Schlüssels erreicht wird, wird die nächste Operation wieder mit dem ersten Zeichen des Schlüssels durchgeführt usw. Effektiv hast du die Schlüssel dann aneinander gehängt.



  • //ich machs jetzt mal ohne schleife
    verschluesselt[0]=text[0]^schluessel[0];
    //geichbedeutend mit:
    //x=97 ^ 100 wobei sich dann für x 5 ergibt; vgl. bitmuster nach der
    //Operation wandel es in Zahl um und guck in der Asciitabelle welchem Zeichen
    //das entspricht.  
    verschluesselt[1]=text[1]^schluessel[1];
    verschluesselt[2]=text[2]^schluessel[2];
    

    wieso machst du das dreimal ?
    und unter was muss ich nachschlagen im buch wenn ich das mit den xyz[] also den [] erklärt haben will?
    thx nochmal



  • Hallo,

    ich hätte das auch in einer Schleife machen können, aber ich wollte halt jeden Schritt mal zeigen. Der op[] wird in jedem C oder C++ Tutorial beim Kapitel über Arrays abgehandelt. Du weisst was Arrays sind oder ?



  • ich hätte das auch in einer Schleife machen können

    ja aber wieso musst du es überhaupt dreimal machen?
    ____

    Du weisst was Arrays sind oder

    joa klar, code seit einiger zeit in php



  • Hallo,

    Wenn ich einen string mit Länge n habe (ohne den Terminierer mitzuzählen) und ich muss die Operation auf jeden Buchstaben anwenden,dann ergibt das n Druchläufe. Ich bin in meinem Beispiel davon ausgegangen dass mein String 3 Zeichen enthält.
    War also völlig willkürlich, dass 3 Durchgänge entstanden sind.


Anmelden zum Antworten