ganz kleine kryptographie...
-
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.
dasvoid 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.