ganz kleine kryptographie...
-
Also ich will ein ( ganz kleines ) proggie schreiben, was einen Satz verschlüsselt, die verschlüsselung kann auch ganz easy sein, nur man sollte nicht nach 2sek hingucken erkennen können( also nicht einfach buchstaben verdoppeln etc :).
Also eigentlich wäre das ganze ja so
a --> 1
b --> 2
c --> 3
etc.
dann würde der das wort hallo wiefolgt aussehen 8 1 12 15 das dann noch in en alogorythmus --> x-4*(3^2)-x/2 ( z.b. mann muss nir gcuken das IMMER was gerades rauskommt) dann bekommt man für h bzw 8 = 14 raus, dass wäre dann n und dann hätte man schonmal n, allerdings mein prob, wie mach ich das wenn die zahl größer al 26 ist, und wie mach ich das, dass aus dem wort hallo automatisch die buchstaben zerlegt werden und in zahlen umgerechnet werden, dann soll der fertige satz noch in einer txt datei gespeichert werden, wie geht das
-
Hallo,
jeder Buchstabe hat auch eine zahlenwert. Du kannst also mit chars rechnen.
Dann gehst du dein Wort in ner Schleife duch und wendest den algortihmmus an.void enc(const char *plain,char *ciph){ while(*(plain++)) *(ciph++)=algo(*plain); }
Wenn die zahlen größer 26 sind könntest du modulo 26 reduzieren. Aber dann hast du das Problem dass du keine eindeutige Abbildung der Buchstaben hast.
-
prolog schrieb:
Hallo,
void enc(const char *plain,char *ciph){ while(*(plain++)) *(ciph++)=algo(*plain); }
Dein Code funktioniert so nicht, weil du das 1. Zeichen von plain auslässt...
Korrekt wäre:while(*plain) *ciph++=algo(*plain++);
-
interpreter schrieb:
prolog schrieb:
Hallo,
void enc(const char *plain,char *ciph){ while(*(plain++)) *(ciph++)=algo(*plain); }
Dein Code funktioniert so nicht, weil du das 1. Zeichen von plain auslässt...
Korrekt wäre:while(*plain) *ciph++=algo(*plain++);
ACK
Sry
-
sry, ich hab probiert das irgendwie einzubaun, habs aber echt nicht verstanden :|
also ich hab ne form mit einem edit label und button, wo kommt das jetzt genau hin?
das wersteh ich voll nicht
thx für schnelle hilfe
-
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 0001wendet 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.
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.